如何找出你性能最差的SQL Server查询

我常常会被反复问到这样的问题:”我有一个性能不好的SQL Server。我如何找出最差性能的查询?“。所以在今天的文章里会给你一些让你很容易找到问题答案的信息向导。sql

问SQL Server!

SQL Server的一个优势是它自己能回答几乎全部你的问题,由于SQL Server在各个DMV和DMF里存储了不少故障排除信息。另外一方面这也是个缺点,由于你必须知道各个DMV/DMF,还有如何把它们解释和关联在一块儿。缓存

至于你的最差性能SQL Server查询的一个最重要的DMV是sys.dm_exec_query_stats。对于每一个缓存的执行计划,SQL Server存储了这个执行计划在运行时的详细信息。另外SQL Server告诉你这个查询消耗的CPU时间和I/O读取。当我对性能不好的SQL Server进行故障排除时,这是我常常使用的基本DMV之一。post

让咱们进入sys.dm_exec_query_stats!

当你对sys.dm_exec_query_stats进行一个简单的SELECT查询,你会获得有不少不一样列的一个很是普遍的记录集——有大量的不一样数字。性能

 

咱们来仔细看下它们。对于每一个缓存的执行计划,SQL Server给你下列度量的信息:spa

  • Worker Time (columns …_工做者时间)
  • Physical Reads (columns …_物理读)
  • Logical Writes (columns …_逻辑写)
  • Logical Reads (columns …_逻辑读)
  • SQLCLR Time (columns …_公共语言运行时间)
  • Elapsed Time (columns …_运行时间)
  • Row Count (columns …_行数)

对于每一个度量,你获得4个集合信息的不一样列:code

  • 总值(Total value)
  • 上个值(Last value)
  • 最小值(Min value)
  • 最大值(Max value)

手上有了这些信息找出你性能最差的查询是什么。但首先你要知道什么是你的性能瓶颈——CPU仍是I/O限制?若是你的性能瓶颈是CPU限制,你能够用下列查询问SQL Server根据CPU消耗列出前5个最差性能的查询:orm

-- Worst performing CPU bound queries
SELECT TOP 5
    st.text,
    qp.query_plan,
    qs.*
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY total_worker_time DESC
GO

你能够看到这里我使用了简单的ORDER BY total_worker_time DESC来返回CPU密集的查询。另外也经过调用sys.dm_exec_sql_textsys.dm_exec_query_plan DMF来抓取SQL语句和执行计划自己。下列代码显示如何依据I/O消耗来找出你性能最差的查询。 blog

 1 -- Worst performing I/O bound queries
 2 SELECT TOP 5
 3     st.text,
 4     qp.query_plan,
 5     qs.*
 6 FROM sys.dm_exec_query_stats qs
 7 CROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) st
 8 CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
 9 ORDER BY total_logical_reads DESC
10 GO

当在你面前有SQL语句和执行计划时,你能够进一步分析查询找出是什么引发高CPU或I/O消耗。产品

小结

SQL Server是个惊艳的产品:它能够当即给你问题的很好答案。你只要知道在哪里找你的答案。至于性能不好的查询,你总应该经过分析DMV sys.dm_exec_query_stats开始,在这里SQL Server保存里你执行计划运行时统计信息。it

感谢关注!

相关文章
相关标签/搜索