Sql-Server

如何在查詢儲存中查找導致不同查詢計劃的輸入

  • February 15, 2019

查詢儲存表明一個完全參數化的查詢有多個查詢計劃:

查詢儲存 UI 的螢幕截圖,顯示同一查詢的多個計劃

如何找到導致如此長響應時間的輸入?

為什麼相同的參數化查詢會以不同的查詢計劃結束?我在哪裡可以了解更多資訊?

如果您想在查詢儲存使用者界面中執行此操作,您可以查看每個計劃的編譯值,以查看哪些參數值導致不同的計劃:

  • 點擊螢幕截圖中計劃摘要中的一個彩色圓圈
  • 右擊底部出現的圖形執行計劃,選擇“屬性”
  • 在屬性窗格中展開“參數列表”節點

執行計劃屬性參​​數列表截圖

在這裡,我正在查看導致“綠色”計劃的編譯值。點擊“橙色”計劃將顯示該計劃的編譯值。

如果您不想使用使用者界面,您可以使用 Max Vernon 在此處描述的方法直接從查詢儲存表中獲取計劃:SQL Server 查詢儲存是否擷取參數值?

正如Aaron Bertrand在評論中提到的:

計劃可能因各種原因而改變,例如使統計數據無效的重大數據更改。其他一些相關資訊herehere

一個新的計劃可能會因為許多不同的原因而被編譯(包括統計更新、手動計劃清除、添加或重建索引等)。

在我的螢幕截圖中,我可以看到該查詢的新計劃於 2 月 9 日下午 12:18 出現。查看執行計劃屬性的 OptimizerStatsUsage 節點,我可以看到此查詢使用的一些統計資訊在此之前已更新,所以這就是我獲得新計劃的原因:

執行計劃屬性中優化器統計資訊使用的螢幕截圖

SQL Server 根據參數值選擇不同計劃的過程是什麼?我想了解更多。

SQL Server 用來根據不同的輸入參數生成特定計劃的過程稱為“參數嗅探”。這是一個非常複雜的話題,您可以在 Erik Darling 的回答中閱讀更多關於它的資訊:

為什麼我的查詢突然比昨天慢?

在該答案底部的“了解更多”連結中,有一些關於參數嗅探主題的非常全面的討論。

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