Sql-Server

將執行計劃保存在記憶體中

  • August 12, 2017

如何將查詢執行計劃保留在 SQL Server 的記憶體中並多次使用?

當我第一次執行查詢時,需要 7 秒。之後只需 1 秒鐘。此查詢每天執行一次。

有什麼辦法可以保留執行計劃並每天使用嗎?

AFAIK,您不能強制計劃保留在記憶體中。但是,由於多種原因,查詢可能會被拋出記憶體。閱讀有關執行計劃的部落格。它說明了執行計劃無效的一些原因:

  • 更改查詢引用的表的結構或架構
  • 更改查詢使用的索引
  • 刪除查詢使用的索引
  • 更新查詢使用的統計資訊
  • 呼叫函式 sp_recompile
  • 使查詢引用的表中的鍵經受大量插入或刪除
  • 對於帶有觸發器的表,插入或刪除的表顯著增長
  • 在單個查詢中混合 DDL 和 DML,通常稱為延遲編譯
  • 在查詢執行期間更改 SET 選項
  • 更改查詢使用的臨時表的結構或架構
  • 查詢使用的動態視圖的更改
  • 查詢中游標選項的更改
  • 對遠端行集的更改,例如在分佈式分區視圖中
  • 使用客戶端游標時,如果更改了 FOR BROWSE 選項

另一個陷阱可能是查詢發生了變化。如果 where 子句發生更改(例如,您按日期過濾)並且您不使用綁定,則可能會發生這種情況

想一想,您還沒有說明您檢查了執行計劃是否仍在記憶體中。您應該查詢記憶體以找出答案。但是,由於您說您的查詢每天只執行一次,因此該計劃可能剛剛過期。該部落格實際上提到了關於 sql server 如何確定計劃何時到期的公式:

如果滿足以下條件,則將從記憶體中刪除該計劃:

  • 系統需要更多記憶體
  • 計劃的“年齡”已經歸零
  • 現有連接目前未引用該計劃

一般來說,如果你有一個大的報告,7 秒還不錯。喝杯咖啡需要更長的時間。除了為最終使用者浪費 6 秒的生產力之外,它還會產生其他問題嗎?

可能不是執行計劃讓它變得更快。就是數據。

執行查詢後,SQL Server 可能會將數據保存在記憶體中。因此,它不必從磁碟讀取來獲取資訊,而是可以從 RAM 中提取資訊,這要快得多。

雖然您的執行計劃也可能儲存在計劃記憶體中,但我非常懷疑編譯執行計劃是否會使您的查詢執行時間增加七倍。

如果您足夠頻繁地使用計劃和數據,並且伺服器上沒有任何“記憶體壓力”(由於物理記憶體太少),那麼計劃和數據將自動保留在記憶體中。您不能真正強制計劃或數據在記憶體中保持固定 - 如果記憶體太緊,它將被丟棄。

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