Logical Scan Fragmentation 掃描索引頁中失序頁的百分比
Extent Scan Fragmentation 不實際相鄰和包含鏈路中所有鏈
接頁的區域數
Avg. Bytes Free per Page 掃描頁面中平均自由字節數
Avg. Page Density (full) 平均頁密度,表示頁有多滿
從上面命令的執行結果可以看的出來,Best count為3 而Actual Count為5這表明orders表有分塊需要重構表索引。下面通過DBCC DBREINDEX來重構表的簇索引。
同樣在Query Analyzer中輸入命令:
use northwind
dbcc dbreindex('northwind.dbo.orders',pk_orders,90)
執行結果:
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Dbcc dbreindex參數說明:第一個參數為要重構的表明。第二個參數為需要重構的索引表識,‘’表示所有的索引。第三個參數為頁的填充因子,填充因子越大,頁越滿。
然後再用DBCC SHOWCONTIG查看重構簇索引後的結果:
use northwind
declare @table_id int
set @table_id=object_id('orders')
dbcc showcontig(@table_id)
返回結果如下:
DBCC SHOWCONTIG scanning 'Orders' table...
Table: 'Orders' (21575115); index ID: 1, database ID: 6
TABLE level scan performed.
- Pages Scanned................................: 22
- Extents Scanned..............................: 3
- Extent Switches..............................: 2
- Avg. Pages per Extent........................: 7.3
- Scan Density [Best Count:Actual Count].......: 100.00% [3:3]
- Logical Scan Fragmentation ..................: 0.00%
- Extent Scan Fragmentation ...................: 33.33%
- Avg. Bytes Free per Page.....................: 869.2
- Avg. Page Density (full).....................:
為了使混亂變為有序,就要生成索引。生成索引後,就有了索引頁和數據頁,數據頁保存用戶寫入的數據信息。索引頁存放用於檢索列的數據值清單(關鍵字)和索引表中該值所在紀錄的地址指針。索引分為簇索引和非簇索引,簇索引實質上是將表中的數據排序,就好像是字典的索引目錄。非簇索引不對數據排序,它只保存了數據的指針地址。向一個帶簇索引的表中插入數據,當數據頁達到100%時,由於頁面沒有空間插入新的的紀錄,這時就會發生分頁,SQL Server 將大約一半的數據從滿頁中移到空頁中,從而生成兩個半的滿頁。這樣就有大量的數據空間。簇索引是雙向鏈表,在每一頁的頭部保存了前一頁、後一頁地址以及分頁後數據移動的地址,由於新頁可能在數據庫文件中的任何地方,因此頁面的鏈接不一定指向磁盤的下一個物理頁,鏈接可能指向了另一個區域,這就形成了分塊,從而減慢了系統的速度。對於帶簇索引和非簇索引的表來說,非簇索引的關鍵字是指向簇索引的,而不是指向數據頁的本身。
為了克服數據分塊帶來的負面影響,需要重構表的索引,這是非常費時的,因此只能在需要時進行。可以通過DBCC SHOWCONTIG來確定是否需要重構表的索引。下面舉例來說明DBCC SHOWCONTIG和DBCC REDBINDEX的使用方法。以SQL Server自帶的northwind數據作為例子
帶開SQL Server的Query analyzer輸入命令:
use pubs
declare @table_id int
set @table_id=object_id('tbldlvinfoback')
dbcc showcontig(@table_id)
這個命令顯示pubs數據庫中的tbldlvinfoback表的分塊情況,結果如下:
DBCC SHOWCONTIG 正在掃描 'tblDlvInfoback' 表...
表: 'tblDlvInfoback'(1797581442);索引 ID: 0,數據庫 ID: 5
已執行 TABLE 級別的掃描。
- 掃描頁數.....................................: 197214
- 掃描擴展盤區數...............................: 24659
- 擴展盤區開關數...............................: 24658
- 每個擴展盤區上的平均頁數.....................: 8.0
- 掃描密度[最佳值:實際值]....................: 99.97%[24652:24659]
- 擴展盤區掃描碎片.............................: 15.46%
- 每頁上的平均可用字節數.......................: 374.6
- 平均頁密度(完整)...........................: 95.37