Performance

如何找出我的 SqlServer 2005 CPU 主要在處理什麼?

  • November 29, 2020

如果這有點像菜鳥問題,我深表歉意。

在網上查看後,我發現一些文章解釋瞭如何使用 sys.dm_exec_query_stats 查找每個查詢的工作時間。例如

SELECT TOP(10)
creation_time
, last_execution_time
, (total_worker_time+0.0)/1000 AS total_worker_time
, (total_worker_time+0.0)/(execution_count*1000) AS [AvgCPUTime] , execution_count
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) st
WHERE total_worker_time > 0
ORDER BY total_worker_time DESC

這裡

但根據微軟的說法,total_work_time只告訴我們在生成計劃後花費的時間,而不是例如為該查詢建構計劃所花費的時間。

有沒有辦法確定在建構計劃時花費了多少 CPU,更好的是,按任務(例如建構計劃、執行查詢、索引)對 CPU 百分比進行簡單細分。

先感謝您。

參考:https ://docs.microsoft.com/en-us/sql/t-sql/statements/set-statistics-time-transact-sql

您可以使用SET STATISTICS TIME ON.

你可以得到一個細分:

  • SQL Server 解析和編譯時間
  • SQL Server 執行時間

您可以在 Management Studio 中為所有查詢或每個會話打開此功能。

在此處輸入圖像描述

執行查詢後,流程會經歷幾個階段:

在第一階段,它會檢查您的程式碼是否正確

第二階段它綁定您提供的表和列。如果失敗,會給你一個不存在的表/列的錯誤

在第三階段,查詢被傳遞給查詢優化器(假設您沒有使用查詢儲存功能)檢查它是否有記憶體計劃,以及統計資訊是否是最新的。根據結果,它可以創建一個新計劃,也可以使用現有計劃。它甚至可以創建一個簡單的計劃,如果查詢足夠簡單但現在不是問題。

查詢優化器決策幾乎不會對您的查詢執行產生任何影響,因為無論查詢多麼複雜,它都有一定的時間來創建計劃,這就是為什麼它可以為未優化的查詢和過時的統計資訊創建非最佳計劃的原因。

您可以做的是使用此查詢來獲取最昂貴的查詢,以及某個查詢已執行多少次。如果相關查詢的 executions_count 數量沒有增加,則意味著它為它創建了一個新的計劃(這主要發生在 ad-hoc 查詢中)。還要注意 last_logical_reads,elapsed_time,last_rows 如果對 10 行的結果集進行等 100000 次邏輯讀取是有意義的,在這種情況下,您需要優化查詢,同樣可以應用於 last_elapsed 時間,如果它太長,並且您的邏輯讀取和行數很少,請檢查它是否包含某種標量函式,改用 UDF,等等。

SELECT TOP 10
execution_count ,
total_worker_time / execution_count AS [Avg CPU Time] ,last_worker_time ,max_dop,last_logical_reads,last_elapsed_time,last_rows,
CASE WHEN deqs.statement_start_offset = 0
AND deqs.statement_end_offset = -1
THEN '-- see objectText column--'
ELSE '-- query --' + CHAR(13) + CHAR(10)
+ SUBSTRING(execText.text, deqs.statement_start_offset / 2,
( ( CASE WHEN deqs.statement_end_offset = -1
THEN DATALENGTH(execText.text)
ELSE deqs.statement_end_offset
END ) - deqs.statement_start_offset ) / 2)
END AS queryText
FROM sys.dm_exec_query_stats deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.plan_handle) AS execText
ORDER BY deqs.total_worker_time DESC ;  

總之,盡量避免臨時查詢,使用儲存過程或 indexed_views。

希望能幫助到你!

引用自:https://dba.stackexchange.com/questions/177016