Sql-Server

我可以告訴 SQL Server 不要將數據放在緩衝區記憶體中嗎?

  • March 12, 2016

我支持的其中一台伺服器有一個每天早上執行的 ETL 作業。這不是一個 SSIS 包,只是一系列通過 SQL Server 代理執行的儲存過程。該作業需要幾個小時才能執行,並且經常將伺服器的頁面預期壽命降低到 100 以下,這並不奇怪,因為它幾乎影響了主操作數據庫中的每個表。

在正常操作使用期間不需要它讀取的大部分數據,因此它只是在緩衝區記憶體中浪費空間,直到工作完成並且記憶體可以開始用實際有用的數據填充備份。是否有任何機制可以告訴 SQL Server 在執行這些儲存過程時不要替換緩衝區記憶體中的內容?

我可以告訴 SQL Server 不要將數據放在緩衝區記憶體中嗎?

不可以。SQL Server 必須將頁面帶入記憶體才能使用它們。沒有配置選項可以直接影響頁面在記憶體中的保留時間,或者用於管理緩衝池使用的各種策略。

如果您的過程涉及更改數據,您可以通過發出手動檢查點在一定程度上影響對緩衝池的影響(哈哈!)。這將強制將修改的(臟)頁面寫入磁碟,釋放它們以供重用。

資源調控器目前僅支持限制工作空間記憶體(由排序、散列操作和並行緩衝區使用)。它沒有提供限制緩衝池用於記憶體數據和索引頁的方法。

通常,您將不得不依賴 SQL Server 對緩衝池中的空間使用做出正確的決策。ETL 作業可能會從目前的安排中受益,因此如果您能夠限制其對緩衝池的使用,您很可能會發現負面的性能影響。

如果您確定絕大多數緩衝池正在被已完成的 ETL 操作佔用,您可能會發現在 ETL 過程結束時顯式刷新臟頁並清除緩衝池是值得的:

CHECKPOINT;
DBCC DROPCLEANBUFFERS;

這通常不適用於生產系統,但您可能會發現它在這種特定情況下有所幫助。在沒有臟頁和空緩衝池的情況下,SQL Server 將開始以最大速率為新工作負載獲取頁。

特別是,緩衝池低於伺服器記憶體目標將啟用加速讀取 - 每當從持久儲存請求頁面時,都會讀取整個範圍。這在 Enterprise Edition 中預設有效,並且可以使用全域跟踪標誌 840 為其他版本(甚至 Express)啟用,請參閱:

FIX:讀取大量數據的應用程序查詢可能很慢,並且 SQL Server 服務在 SQL Server 2005 中可能需要很長時間才能啟動

從那個連結:

此修復程序公開了跟踪標誌 840。當打開跟踪標誌 840 時,SQL Server 可以在 SQL Server 啟動時執行更大的 I/O 範圍讀取以填充緩衝池。較大的 I/O 範圍讀取更快地填充緩衝池。此外,更大的 I/O 範圍讀取改進了 SQL Server 啟動時的初始查詢編譯和響應時間。

儘管該文本提到 SQL Server 啟動,但它也適用於緩衝池重新填充,如上所述。

當然,您也可以通過對要在 ETL 過程結束時帶入記憶體的結構執行虛擬查詢來幫助此過程。

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