Sql-Server

sp_WhoIsActive 等待資源

  • January 11, 2019

我在 SQL Server 2016 中有一個巨大的查詢——當我對記錄子集執行查詢時,它會在 15 分鐘內完成。當我將其推斷為記錄總數時,它應該在 1 小時內完成。但即使在 3 小時後它也不完整。當我檢查時 master.sys.sysprocesses,有一個 CXPACKET 等待,等待時間為 10293331

SELECT waittime, waittype, lastwaittype,  open_tran, cpu, physical_io, [sid], loginame, [sql_handle]      
FROM master.sys.sysprocesses WHERE SPID=58

注意:我做了 execsp_Who2來獲得特定的 SPID=58

在此處輸入圖像描述

如何使用 sp_WhoIsActive 查找慢速 SQL Server 查詢

@get_task_info = 2 – 如果查詢已並行,並且您正在排除 CXPACKET 等待問題,您可以確定查詢中的每個任務正在等待什麼。

我用@get_task_info = 2 執行了 sp_WhoIsActive。

wait_info給出以下內容:

(5x: 68/168850/635541ms)CXPACKET:15, (3x: 3/16/32ms)CXPACKET:7, (1x: 10207374ms)CXPACKET:1

如何從這些資訊中確定每個任務正在等待什麼?

更新

這個問題更多是關於找到一種“方法”來找出等待資源(使用 sp_WhoIsActive 或類似的),而不是通過添加 MAXDOP 或分析執行計劃來實際解決目前的性能問題。

這個問題更多是關於找到一種“方法”來找出等待資源(使用 sp_WhoIsActive 或類似的),而不是實際解決目前的性能問題

如果您正在尋找這些數字的含義,請查看sp_whoisactive 文件

從 Adam Machanic 的CXPACKET 節點標識符頁面中,您可以在輸出中看到這一行:

(5x: 68/168850/635541ms)CXPACKET:15

(3x: 3/16/32ms)CXPACKET:7

(1x: 10207374ms)CXPACKET:1

意味著有

  • 在執行計劃的節點 15 中等待 CXPACKET 的 5 個任務
  • 在執行計劃的節點 7 中等待 CXPACKET 的 3 個任務
  • 5 個任務在執行計劃的節點 1 中等待 CXPACKET

此處記錄了由斜線分隔的 3 個數字:

(Nx:MINms/AVGms/MAXms)

$$ wait_type $$其中Nx是任務數,MINms是任務的最短等待時間,AVGms是任務的平均等待時間,MAXms是任務的最長等待時間

的輸出@get_task_info = 2告訴你

  • 您的查詢在執行計劃中的確切位置卡住了
  • 有多少任務卡在那裡,以及
  • 他們被困在那裡多長時間(最小,最大和平均)

希望這為您提供了足夠的資訊,以便您能夠找到查詢的哪一部分卡在這些並行等待中,以便您可以進一步調查。

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