2010-03-23 90 views

回答

24

十大最差查詢基於...:

SELECT TOP 10 
    total_worker_time/execution_count AS Avg_CPU_Time 
     ,execution_count 
     ,total_elapsed_time/execution_count as AVG_Run_Time 
     ,(SELECT 
       SUBSTRING(text,statement_start_offset/2,(CASE 
                  WHEN statement_end_offset = -1 THEN LEN(CONVERT(nvarchar(max), text)) * 2 
                  ELSE statement_end_offset 
                 END -statement_start_offset)/2 
         ) FROM sys.dm_exec_sql_text(sql_handle) 
     ) AS query_text 
FROM sys.dm_exec_query_stats 

--pick your criteria 

ORDER BY Avg_CPU_Time DESC 
--ORDER BY AVG_Run_Time DESC 
--ORDER BY execution_count DESC 
+0

+1對我來說工作得很好。似乎是在返回的行中的一些重複,但看起來正確的:) – 2010-03-23 13:41:18

+2

在行中的重複可能是已經失效的舊版本的查詢計劃(各種原因,統計變化是一個常見的)計劃不會彈出從記憶無效,所以他們出現。另一個原因是參數化(或者說缺少),這意味着許多具有不同參數的類似查詢可以存在於緩存中,發生在臨時SQL而不是存儲過程中,但是當它不是存儲過程時看起來像是大量重複。 – Andrew 2010-03-23 15:12:50

+0

@KM:添加一個輕微的替代答案的intead,如何加入sys.dm_exec_query_plan並拉動查詢計劃 - 總是值得從表現最差的緩存中提取。 – Andrew 2010-03-23 15:14:39

3

查找慢速執行的查詢與SQL事件探查器

  • 開始:

    SELECT TOP 5 obj.name, max_logical_reads, max_elapsed_time 
    FROM sys.dm_exec_query_stats a 
    CROSS APPLY sys.dm_exec_sql_text(sql_handle) hnd 
    INNER JOIN sys.sysobjects obj on hnd.objectid = obj.id 
    ORDER BY max_logical_reads DESC 
    

    來自SQL Profiler(最好在實時數據庫上)。

  • 文件 - >新建跟蹤
  • 選擇SQL服務器
  • 標籤過濾
  • 任選地在表中設置一個過濾器上的數據庫名稱
  • 啓動Profiler(RUN)
  • 保存的結果,例如:_Mytrace,preferrably在數據庫服務器上已沒有什麼可通過時間
  • 已經做
  • 過濾器的選擇查詢
  • 爲了他們這個
  • 檢查exectution計劃查詢
+0

運行探查器無疑是一個很好的選擇。一旦你對Profiler功能有了很好的理解,你可以運行痕跡。 – 2010-03-23 13:00:40

+0

只是不要讓分析器在生產服務器本身上運行太久。在它的默認模式下,它是一個資源管理器。 – 2010-03-23 13:01:08

4

如果你想找到所用的時間表現最差的查詢,我會使用這樣的:

SELECT * 
FROM sys.dm_exec_query_stats a 
CROSS APPLY sys.dm_exec_sql_text(sql_handle) hnd 
ORDER BY total_elapsed_time/execution_count DESC 

但是,找到「最差」的查詢往往需要更多地探究exec_query_stats DMV。有很多事情需要考慮:

  1. 最糟糕的個別查詢所花費的時間,上述查詢將產生。
  2. 最差佔用大量CPU資源(如果你是在CPU高運行),這將通過total_worker_time/execution_count
  3. 查詢訂單做最讀取這往往是時間最長的查詢。

現在,這些查詢將突出顯示性能較差的查詢,但通常您可能會詢問具有「公平」性能的查詢,但會非常頻繁地調用,從而降低應用的整體性能。要找到這些,請按total_elapsed時間(或total_[whatever metric you are interested in])訂購以上查詢,並且不要按execution_count除。

6

This MSDN Magazine文章提供了有關此主題的出色信息。

+0

+1真棒文章! – 2010-03-23 13:28:51

+0

+1優秀的文章,但2008年遇到麻煩。 – 2010-03-23 13:40:34

+0

@ThomasBratt您可能需要更改數據庫的兼容級別以運行這些查詢。我做到了。 – 2012-11-13 19:06:52