Sql-Server

計劃記憶體中的串列計劃

  • July 18, 2018

我有一個較早執行緩慢的查詢。後來我發現它沒有並行執行,這使得查詢執行速度變慢。

該查詢涉及一個大view然後查詢具有大量temp tables和的視圖sub query

UDF從視圖中刪除了一個並使用inline functions並使用了一個標量TVF,然後它開始在parallel execution.

這幾天進展順利,有一天我注意到查詢執行緩慢。於是我檢查了執行計劃,發現查詢是以串列方式執行的。我檢查了查詢的計劃記憶體,我看到了很多涉及該視圖的記憶體計劃。我刪除了不並行的計劃,然後查詢快速執行。

現在我每天早上都這樣做以強制查詢並行執行。

額外細節:

  1. SQL Server 2016 標準版
  2. 查詢通過 LINQ-SQL 從 dot net 應用程序生成。所以臨時查詢。

如何強制查詢永遠並行執行?

乍一看,這聽起來像是一個經典的參數嗅探問題。

SQL Server 為需要編譯計劃時呼叫的第一組參數建構一個執行計劃,然後在一天中一遍又一遍地重用該計劃。您可以看到它們是什麼參數 - 當您查看串列計劃時,右鍵點擊選擇語句,然後進入屬性。在屬性視窗中,查找參數,然後查找編譯值。這將向您展示哪些值產生了串列計劃。

要強制計劃始終並行執行,您有幾種不同的選擇(其中許多選項 Erland 在我上面連結的他的優秀文章中介紹過),包括:

  • 調整索引,讓一切都有一個更好的計劃(要獲得這方面的建議,請發布計劃和伺服器詳細資訊,如獲取慢查詢幫助中所述
  • 暫時使用計劃指南將並行計劃固定在記憶體中(但只要知道如果查詢更改單個字母,計劃指南將靜默失敗,因為它不再匹配查詢)
  • 在計劃中使用 OPTIMIZE FOR 提示將其引導至產生並行計劃的值
  • 在 SQL Server 2016 中使用新的 ENABLE_PARALLEL_PLAN_PREFERENCE 提示

這只是一個快速的答案 - 但要了解更多資訊,請閱讀Erland 的優秀文章,應用程序中的慢,SSMS中的快,它解釋了一個查詢如何獲得不同的計劃,以及如何修復它。

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