Sql-Server

有沒有辦法通過 SQL Server 2008 強制索引留在記憶體中?

  • December 18, 2019

我有一個包含數百萬行的表,我需要不時從中執行一些查詢。第一次查詢通常會很慢(大約 10 秒),隨後的查詢通常會更快(大約 1 秒)。幾個小時後,緩慢/然後快速的循環再次開始。

我已經檢查了我的執行計劃,所有需要的索引都存在並得到了適當的使用,我認為性能差異是由於索引實際上在記憶體中用於後續查詢(我是對的,還是有其他可能的原因?)

我還使用索引執行了許多其他查詢,但這些查詢耗時更少,性能也不那麼關鍵,所以我擔心這些索引實際上會將我的關鍵索引推出記憶體記憶體。

除了明顯的“添加更多 RAM”修復之外,我一直在考慮編寫虛擬查詢腳本以每小時執行一次以強制索引回到記憶體中。

有沒有更優雅的方法來做到這一點?就像一種暗示 SQLServer 的方法,如果它只有足夠的記憶體來記憶體一個索引,它應該是那個?

我知道通常最好的辦法是不要在這類事情上搞砸 SQLServer,但是我的查詢的不尋常性質(很少執行,但時間緊迫)讓我相信它是有意義的(如果可能的話) .

我也很想知道是否有辦法知道在給定時間哪些索引記憶體在記憶體中?

曾經有一個DBCC PINTABLE命令,但我相信它在 6.5 或 7.0 中停止工作。如果您嘗試它,該聲明可能仍會表明它有效,但它只是返回,它確實是一個無操作。

不幸的是,實際上並沒有任何方法可以控制哪些索引保存在記憶體中 - 我所知道的對於定期熱的表的最佳解決方法是手動保持它們熱(您已經在問題中描述過)。

對於記憶體中的索引,您可以從sys.sm_os_buffer_descriptors. 我發布了一個關於此的提示:

http://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/

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