在執行並行暫存表載入時減少記憶體壓力
我正在嘗試將我的數據倉庫中的幾個非常大的表遷移到新的分區方案(舊的分區方案基於一個
RANGE LEFT
沒有定期拆分的函式,並且最近的數據在最後一個文件組中是頭重腳輕的) . 這些表足夠大(50 億行,400 GB 數據空間),由於擔心日誌記錄空間不足,我不敢嘗試重建聚集索引。我試圖通過
INSERT...(WITH TABLOCK) SELECT...WHERE <check constraint predicate> (OPTION MAXDOP 4)
在相同的暫存表中執行幾條語句來載入新表,方案中的每個文件組一個,稍後我將切換到替換錶中。我通過單個 SSA 作業協調執行這種虛假批量載入,以利用預讀/旋轉木馬。在相對較小的桌子上,所有工作都很好,所有作業都會同時執行。但是,在第一個大表上,大多數 SSA 作業都
RESOURCE_SEMAPHORE
在等待,而第一個分區的作業正在執行。如果我的伺服器有 768 GB RAM、24 個核心(超執行緒)並且它在 400 GB 表上工作,我應該
MAXDOP
向下調整以釋放更多授權還是啟用資源管理器來減少最大授權以獲取更多 SSA 工作啟動和並行工作?我最初嘗試了
BULK_LOGGED
恢復模式,但去了SIMPLE
. 交易規模依然巨大;我生成了超過 1 TB 的日誌,複製了 15 GB(如果數據集未排序,則必須是由於頁面拆分,我正在使用頁面壓縮,並且我執行的不是MAXDOP 1
.我正在開發一個 FTDW 設備(本地 SSD 陣列的吞吐量約為 5 GB/s,PureStorage 陣列的峰值速度為 11 GB/s),因此希望磁碟延遲不會成為問題。我正在用 SMO 編寫 SSA 作業。
Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 2016 年 10 月 28 日 18:17:30 版權所有 (c) 微軟公司 企業版:基於核心的許可(64 位) 在 Windows Server 2012 R2 標準 6.3(內部版本 9600:)上
如果您在此處查看我的答案,我會提到一個新的(ish)查詢提示
MAX_GRANT_PERCENT
,您可以使用它來進一步控制查詢級別的記憶體授予。文件在這裡。
假設查詢在
default
池中並且您沒有更改它,現在他們可以請求 768 GB RAM 的 25%。那是很多記憶。您將不得不降低百分比,直到您在並發和不溢出到磁碟之間找到平衡。
希望這可以幫助!