Sql-Server
如何在查詢儲存中查找導致不同查詢計劃的輸入
查詢儲存表明一個完全參數化的查詢有多個查詢計劃:
如何找到導致如此長響應時間的輸入?
為什麼相同的參數化查詢會以不同的查詢計劃結束?我在哪裡可以了解更多資訊?
如果您想在查詢儲存使用者界面中執行此操作,您可以查看每個計劃的編譯值,以查看哪些參數值導致不同的計劃:
- 點擊螢幕截圖中計劃摘要中的一個彩色圓圈
- 右擊底部出現的圖形執行計劃,選擇“屬性”
- 在屬性窗格中展開“參數列表”節點
在這裡,我正在查看導致“綠色”計劃的編譯值。點擊“橙色”計劃將顯示該計劃的編譯值。
如果您不想使用使用者界面,您可以使用 Max Vernon 在此處描述的方法直接從查詢儲存表中獲取計劃:SQL Server 查詢儲存是否擷取參數值?
正如Aaron Bertrand在評論中提到的:
一個新的計劃可能會因為許多不同的原因而被編譯(包括統計更新、手動計劃清除、添加或重建索引等)。
在我的螢幕截圖中,我可以看到該查詢的新計劃於 2 月 9 日下午 12:18 出現。查看執行計劃屬性的 OptimizerStatsUsage 節點,我可以看到此查詢使用的一些統計資訊在此之前已更新,所以這就是我獲得新計劃的原因:
SQL Server 根據參數值選擇不同計劃的過程是什麼?我想了解更多。
SQL Server 用來根據不同的輸入參數生成特定計劃的過程稱為“參數嗅探”。這是一個非常複雜的話題,您可以在 Erik Darling 的回答中閱讀更多關於它的資訊:
在該答案底部的“了解更多”連結中,有一些關於參數嗅探主題的非常全面的討論。