我常常會被反覆問到這樣的問題:」我有一個性能不好的SQL Server。我如何找出最差性能的查詢?「。所以在今天的文章裏會給你一些讓你很容易找到問題答案的信息嚮導。sql
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進行一個簡單的SELECT查詢,你會獲得有不少不一樣列的一個很是普遍的記錄集——有大量的不一樣數字。性能
咱們來仔細看下它們。對於每一個緩存的執行計劃,SQL Server給你下列度量的信息:spa
對於每一個度量,你獲得4個集合信息的不一樣列:code
手上有了這些信息找出你性能最差的查詢是什麼。但首先你要知道什麼是你的性能瓶頸——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_text和sys.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
感謝關注!