1. 程式人生 > 實用技巧 >sql的索引碎片檢視和重建(轉載)

sql的索引碎片檢視和重建(轉載)

原文地址:https://blog.csdn.net/zhaow823/article/details/80499431

檢視碎片情況使用 dbcc showcontig 函式來進行

--改成當前庫
use DB_Name
--建立變數 指定要檢視的表
declare @table_id int
set @table_id=object_id('TableName')
--執行
dbcc showcontig(@table_id)

返回結果:

上邊例項的表比較大..一張表佔用的實際物理空間就有24個G(資料20G+ 索引2G+ )..

以下是名詞解釋:

DBCC SHOWCONTIG是顯示指定的表的資料和索引的碎片資訊。

解釋如下:

Page Scanned-掃描頁數:如果你知道行的近似尺寸和表或索引裡的行數,那麼你可以估計出索引裡的頁數。看看掃描頁數,如果明顯比你估計的頁數要高,說明存在內部碎片。

Extents Scanned-掃描擴充套件盤區數:用掃描頁數除以8,四捨五入到下一個最高值。該值應該和DBCC SHOWCONTIG返回的掃描擴充套件盤區數一致。如果DBCC SHOWCONTIG返回的數高,說明存在外部碎片。碎片的嚴重程度依賴於剛才顯示的值比估計值高多少。

Extent Switches-擴充套件盤區開關數:該數應該等於掃描擴充套件盤區數減1。高了則說明有外部碎片。

Avg. Pages per Extent-每個擴充套件盤區上的平均頁數:該數是掃描頁數除以掃描擴充套件盤區數,一般是8。小於8說明有外部碎片。

Scan Density [Best Count:Actual Count]-掃描密度[最佳值:實際值]:DBCC SHOWCONTIG返回最有用的一個百分比。這是擴充套件盤區的最佳值和實際值的比率。該百分比應該儘可能靠近100%。低了則說明有外部碎片。

Logical Scan Fragmentation-邏輯掃描碎片:無序頁的百分比。該百分比應該在0%到10%之間,高了則說明有外部碎片。

Extent Scan Fragmentation-擴充套件盤區掃描碎片:無序擴充套件盤區在掃描索引葉級頁中所佔的百分比。該百分比應該是0%,高了則說明有外部碎片。

Avg. Bytes Free per Page-每頁上的平均可用位元組數:所掃描的頁上的平均可用位元組數。越高說明有內部碎片,不過在你用這個數字決定是否有內部碎片之前,應該考慮fill factor(填充因子)。

Avg. Page Density (full)-平均頁密度(完整):每頁上的平均可用位元組數的百分比的相反數。低的百分比說明有內部碎片

通過sql server 代理建立定時任務定期來重建索引

dbcc dbreindex ([customer],'',90)

第一個引數是要重建索引的表名,第二個引數指定索引名稱,空著就表示所有,第三個引數叫填充因子,是指索引頁的資料填充程度,0表示使用先前的值,100表示每個索引頁都填滿,這時查詢效率最高,但插入索引時會移動其它索引,可根據實際情況來設定。

DECLARE @TABLENAME NVARCHAR(MAX)
IF(CURSOR_STATUS('global','TABLE_CURSOR')<>'-3')
    BEGIN
        CLOSE TABLE_CURSOR
        DEALLOCATE TABLE_CURSOR
    END
DECLARE TABLE_CURSOR CURSOR FOR SELECT NAME FROM SYS.objects WHERE TYPE = 'U' AND name LIKE 'T_HIS%' ORDER BY modify_date DESC
OPEN TABLE_CURSOR
FETCH NEXT FROM TABLE_CURSOR INTO @TABLENAME
WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
        dbcc dbreindex (@TABLENAME,'',80)
        FETCH NEXT FROM TABLE_CURSOR INTO @TABLENAME
    END
CLOSE TABLE_CURSOR
DEALLOCATE TABLE_CURSOR