Sql-Server-2008

為什麼在我重建並重新索引所有內容後我的數據庫仍然碎片化?

  • December 23, 2021

我有一個數據庫,我試圖通過執行這個 T-SQL 一次對所有表進行碎片整理:

SELECT 
       'ALTER INDEX all ON ' + name + ' REORGANIZE;' + CHAR(10) +
       'ALTER INDEX all ON ' + name + ' REBUILD;'
   FROM sys.tables

然後將輸出複制並粘貼到一個新的查詢視窗並執行它。我沒有錯誤,但我仍然有碎片。我也嘗試過分別執行這兩個命令,但仍然有碎片。**注意:**我已經意識到REORGANIZEAaron 沒有必要這樣做,並且我知道我可以使用動態 sql 來自動執行此操作。

我執行它以確定我仍然有碎片:

SELECT * FROM 
sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, NULL) 
WHERE avg_fragmentation_in_percent > 0

我得到了:

我知道我缺少一些真正基本的東西,但我不知道是什麼。

桌子很小。您的表格中的頁數是:

11, 8, 6, 5, 13, 8, 10

它們總共佔用 480kb。從字面上看,沒有什麼可以進行碎片整理的。

編輯:這需要更多解釋。

一個新的表或索引通常分配它的前 8 頁來自混合的,而不是統一的範圍。因此,前 8 頁中的每一頁都可以從不同的混合範圍分配。因此,消耗 8 個頁面的表或索引可能有 8 個片段,8 個不同的混合擴展區中的每一個上有 1 個片段。

因此,更廣泛使用的碎片整理腳本(下面連結的幾個範例)傾向於排除小表。IIRC,<500 頁在其中之一或兩者中。在這些大小下,碎片整理幾乎沒有什麼好處,而且碎片數據可能會因混合區分配而產生偏差。

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