Sql-Server
計劃記憶體中的串列計劃
我有一個較早執行緩慢的查詢。後來我發現它沒有並行執行,這使得查詢執行速度變慢。
該查詢涉及一個大
view
然後查詢具有大量temp tables
和的視圖sub query
。我
UDF
從視圖中刪除了一個並使用inline functions
並使用了一個標量TVF
,然後它開始在parallel execution
.這幾天進展順利,有一天我注意到查詢執行緩慢。於是我檢查了執行計劃,發現查詢是以串列方式執行的。我檢查了查詢的計劃記憶體,我看到了很多涉及該視圖的記憶體計劃。我刪除了不並行的計劃,然後查詢快速執行。
現在我每天早上都這樣做以強制查詢並行執行。
額外細節:
- SQL Server 2016 標準版
- 查詢通過 LINQ-SQL 從 dot net 應用程序生成。所以臨時查詢。
如何強制查詢永遠並行執行?
乍一看,這聽起來像是一個經典的參數嗅探問題。
SQL Server 為需要編譯計劃時呼叫的第一組參數建構一個執行計劃,然後在一天中一遍又一遍地重用該計劃。您可以看到它們是什麼參數 - 當您查看串列計劃時,右鍵點擊選擇語句,然後進入屬性。在屬性視窗中,查找參數,然後查找編譯值。這將向您展示哪些值產生了串列計劃。
要強制計劃始終並行執行,您有幾種不同的選擇(其中許多選項 Erland 在我上面連結的他的優秀文章中介紹過),包括:
- 調整索引,讓一切都有一個更好的計劃(要獲得這方面的建議,請發布計劃和伺服器詳細資訊,如獲取慢查詢幫助中所述)
- 暫時使用計劃指南將並行計劃固定在記憶體中(但只要知道如果查詢更改單個字母,計劃指南將靜默失敗,因為它不再匹配查詢)
- 在計劃中使用 OPTIMIZE FOR 提示將其引導至產生並行計劃的值
- 在 SQL Server 2016 中使用新的 ENABLE_PARALLEL_PLAN_PREFERENCE 提示
這只是一個快速的答案 - 但要了解更多資訊,請閱讀Erland 的優秀文章,應用程序中的慢,SSMS中的快,它解釋了一個查詢如何獲得不同的計劃,以及如何修復它。