數據庫占用cpu較高的查詢


  近來看到別人的有關數據庫查詢cpu占用較高的sql語句(本人sql並不好),所以查詢了一下資料,記錄一下,便於理解和應用。

首先,將語句貼在這里

SELECT TOP 10
  --平均cpu時間 total_worker_time/execution_count AS avg_cpu_cost,
plan_handle, execution_count, (SELECT SUBSTRING(text, statement_start_offset/2 + 1, (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 ORDER BY [avg_cpu_cost] DESC
 

然后,講解一下,我對於這段代碼的理解

 首先將語句分解,最內層的為:

首先 的意思:將text轉化為字符串,然后獲取長度。

然后case when else end的意思:

當 statement_end_offset = -1的時候,輸出text的長度*2 ,如果不是,輸出 statement_end_offset的大小,最終將輸出的結果減去statement_start_offset,最終得到結果。/2,就不用說了,大家都懂的。其中的 text 是屬於dm_exec_sql_text的,即最終的sql語句存儲在這個變量中。

 

然后就是SUBSTRING()函數了。從截圖中可以看出,Substring 的用法及其含義了,第一個參數是表達式,然后是截取開始的位置,然后是長度,這樣就不難理解上面的語句了。

現在,就是這個模塊了首先,需要知道 sys.dm_exec_sql_text(sql_handle) 是什么。

官方解釋:  返回由指定的sql_handle標識的SQL批處理的文本。 也就是說,返回執行的sql語句。

那么,現在開始說 sys.dm_exec_query_stats 官方解釋:返回緩存的查詢計划中的聚合性能統計信息 sql server。緩存計划中的每個查詢語句在該視圖中對應一行,並且行的生存期與計划本身相關聯。從緩存刪除計划時,也將從該視圖中刪除對應行。 備注:若要從我們稱之為Azure SQL數據倉庫或並行數據倉庫,使用名稱 sys.dm_pdw_nodes_exec_query_stats。其中上面用到的參數 sql_handle,statement_start_offset,statement_end_offset 都是它產生的。

列名 數據類型 描述
sql_handle
varbinary(64)

表示包含查詢的皮查詢或存儲過程的標記。

sql句柄以及statement_start_offset和語句結束偏移量,可以用於檢索查詢的sql文本通過調用sys.dm_exec_sql_text動態管理函數。

statement_start_offset int 指示行所說明的查詢在其批查詢或持久化對象文本中的開始位置(一字節為單位,從0開始)。
statement_end_offset int 指示行所說明的查詢在其批查詢或持久化對象文本中的結束位置(以字節為單位,從0開始)。之前的版本為sql server 2014,值為-1指示批處理的末尾。不再包括尾隨的注釋。
total_worker_time bigint 此計划自編譯以來執行所用的cpu時間總量(以微妙為單位報告,但僅精確到毫秒)。
execution_count bigint 計划自上次編譯以來所執行的次數。
plan_handle varbinary(64)

 表示查詢所屬的已編譯計划的標記。此值可以傳遞給sys.dm_exec_query_plan動態管理函數來獲取查詢計划。

當本機編譯的存儲過程查詢內存優化的表時,此項將始終為0x000.

execution_count  bingint  此計划自編譯以來所執行的次數。

 

參照上面表格的,我們不難理解初始的語句了。

但是,對於我自己來說,還是有許多的問題的:

 

第一個:為什么start需要/2+1
第二個:len()獲取到長度為什么需要*2
第三個:最終的結果為什么要/2
第四個:plan_handle得到的結果如何解讀 

請教了別人,得到了答案加上我自己的理解,在此記錄一下第四個的答案(前三個有待研究):

 對於第四個問題,看一個這個文章基本就能夠明白了:https://www.cnblogs.com/huangxincheng/p/4279870.html 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM