SQL Server 對多文件 tempdb 的填充策略是否與多文件(非 tempdb)文件組相同?
來自單個查詢的 tempdb I/O 是否會被拆分到多個 tempdb 文件中?(當然,假設 tempdb 配置為使用多個文件!)
對於非 tempdb 數據庫,MDSN似乎說是的,新添加的數據將分佈在文件組中的多個文件中:
文件組對每個文件組中的所有文件使用比例填充策略。在將數據寫入文件組時,SQL Server 數據庫引擎將與文件中的可用空間成比例的數量寫入文件組中的每個文件,而不是將所有數據寫入第一個文件直到寫滿。然後它寫入下一個文件。例如,如果文件 f1 有 100 MB 空閒空間,文件 f2 有 200 MB 空閒空間,則從文件 f1 分配一個擴展區,從文件 f2 分配兩個擴展區,依此類推。這樣,兩個文件幾乎同時變滿,實現了簡單的條帶化。
這種相同的填充策略是否適用於 tempdb?
這個答案是否取決於查詢的類型,例如並行與非並行?或者答案是否基於 tempdb I/O 的類型而有所不同,例如,對於我創建的 tempables 與數據庫引擎對工作表或溢出的 tempdb 使用情況?
這種相同的填充策略是否適用於 tempdb?
是的,它確實。
為了向自己證明這一點,您可以進行類似於此處描述的測試:
即用一些數據填充臨時表並檢查每個
tempdb
文件使用的空間。我在這裡只引用結論:
文件組對每個文件組中的所有文件使用比例填充策略,並使用循環算法將比例量寫入文件中的可用空間和文件組中的每個文件。
了解 SQL Server 中的比例填充和循環行為不僅對使用者數據庫很重要,對 tempdb 也很重要。SQL Server 最佳實踐是擁有多個 tempdb 數據文件以緩解 tempdb PFS 和 SGAM 爭用。很容易想像,當 tempdb 數據文件大小不均勻時,更大的數據文件上的範圍分配會更重。此配置將再次導致熱點並且不會緩解 tempdb 爭用。
這是進一步閱讀: Paul Randal 將數據文件正確添加到 tempdb
除其他外,Paul 描述瞭如何正確添加文件以匹配現有文件大小,這樣做的原因是比例填充算法。