Sql-Server
高度碎片化是一個問題嗎?
DBCC SHOWCONTIG scanning 'MyTable' table... Table: 'MyTable' (2048062382); index ID: 1, database ID: 28 TABLE level scan performed. - Pages Scanned................................: 1019182 - Extents Scanned..............................: 127400 - Extent Switches..............................: 127399 - Avg. Pages per Extent........................: 8.0 - Scan Density [Best Count:Actual Count].......: 100.00% [127398:127400] - Logical Scan Fragmentation ..................: 0.01% - Extent Scan Fragmentation ...................: 77.25% - Avg. Bytes Free per Page.....................: 135.7 - Avg. Page Density (full).....................: 98.32%
我讀過 Scan Density = 100% 非常好,而 Logical Scan Fragmentation <1% 也很好。77% Extent Scan Fragmentation 困擾著我,但網際網路上說忽略它。
我正在分析一個單表執行速度慢的查詢。它在第一次執行時執行約 30 秒,然後在第二次和後續執行時執行 200 毫秒。我可以使用 重置此行為
DBCC DROPCLEANBUFFERS
。高範圍掃描碎片是一個重要線索嗎?
(如果沒有,我可能會添加另一個關於我的單表查詢的問題)。
根據我的經驗,即使您正在執行全表掃描,範圍碎片也不太可能對性能產生太大影響,對於更典型的查詢模式,它充其量應該可以忽略不計。這適用於使用適合記憶體的記憶體數據的查詢 - 如果數據在記憶體中並且沒有直接從磁碟讀取,那麼任何類型的碎片顯然都會變得毫無意義。
現在,您有一個大於 8 GB 的表,因此範圍碎片可能對您的查詢有害。如果此查詢使用跨 3400 萬行的表掃描,並且您得到的最壞情況(僅在第一次執行時!)是 30 秒,那麼降低該範圍碎片數幾乎不可能有太大幫助。這 30 秒用於將數據載入到記憶體中,我無法理解改善程度碎片會在那里為您帶來很多好處。如果您有足夠的記憶體來將此表保存在記憶體中,也許您應該考慮一個啟動作業或某個後台程序,它們會定期執行查詢而不強制使用者等待它,以確保它在記憶體中保持新鮮。
赫卡頓可能適合你。