Sql-Server

高度碎片化是一個問題嗎?

  • April 17, 2013
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 秒用於將數據載入到記憶體中,我無法理解改善程度碎片會在那里為您帶來很多好處。如果您有足夠的記憶體來將此表保存在記憶體中,也許您應該考慮一個啟動作業或某個後台程序,它們會定期執行查詢而不強制使用者等待它,以確保它在記憶體中保持新鮮。

赫卡頓可能適合你。

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