sqlserver重建(rebuild)索引可以提高查詢速度
當隨著表的數據量不斷增長,很多存儲的數據進行了不適當的跨頁(sqlserver中存儲的最小單位是頁,頁是不不可再分的),會產生很多索引的碎片。這時候需要重建索引來提高查詢性能
SQLServer2005在硬盤中用8KB頁面在數據庫文件內存放數據。缺省情況下這些頁面及其包含的數據是無組織的。為了使混亂變為有序,就要生成索引。生成索引后,就有了索引頁和數據頁之分:數據頁用來保存用戶寫入的數據信息;索引頁存放用于檢索列的數據值清單(關鍵字)和索引表中該值所在紀錄的地址指針。索引分為簇索引和非簇索引,簇索引實質上是將表中的數據排序,就好像是字典的索引目錄。非簇索引不對數據排序,它只保存了數據的地址。向一個帶簇索引的表中插入數據,當數據頁達到100%時,由于頁面沒有空間插入新的的紀錄,這時就會發生分頁,SQLServer將大約一半的數據從滿頁中移到空頁中,從而生成兩個1/2滿頁。這樣就有大量的空的數據空間。簇索引是雙向鏈表,在每一頁的頭部保存了前一頁、后一頁以及分頁后數據移出的地址。由于新頁可能在數據庫文件中的任何地方,因此頁面的鏈接不一定指向磁盤的下一個物理頁。鏈接可能指向了另一個區域,這就形成了分塊,從而減慢了系統的速度。對于帶簇索引和非簇索引的表來說,非簇索引的關鍵字是指向簇索引的,而不是指向數據頁的本身。
為了克服數據分塊帶來的負面影響,需要重構表的索引,這是非常費時的,因此只能在需要時進行??梢酝ㄟ^DBCC SHOWCONTIG來確定是否需要重構表的索引。
DBCC SHOWCONTIG(TABLE_NAME)
返回結果:
DBCC SHOWCONTIG 正在掃描 'TABLE_NAME' 表...表: 'TABLE_NAME' (128211707);索引 ID: 1,數據庫 ID: 5已執行 TABLE 級別的掃描。- 掃描頁數................................: 564273- 掃描區數..............................: 70543- 區切換次數..............................: 70543- 每個區的平均頁數........................: 8.0- 掃描密度 [最佳計數:實際計數].......: 99.99% [70535:70544]- 邏輯掃描碎片 ..................: 0.01%- 區掃描碎片 ..................: 2.52%- 每頁的平均可用字節數........................: 684.6- 平均頁密度(滿).....................: 91.54%DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。
最佳計數為70535,實際計數為70544,這表明該表有分塊,需要重構表索引,掃描密度為100%則表示沒有分塊
如何查看索引的使用情況:SELECT index_type_desc,alloc_unit_type_desc,avg_fragmentation_in_percent,fragment_count,avg_fragment_size_in_pages,page_count,record_count,avg_page_space_used_in_percentFROM sys.dm_db_index_physical_stats(DB_ID('db_name'),OBJECT_ID('table_name),NULL,NULL,'Sampled')
上面的語句是查詢數據庫db_name的表table_name的索引使用情況。
查詢結果中的列avg_fragment_size_in_pages值超過40%就需要重建索引
重建索引:
ALTER INDEX 索引名 ON 表名 REBUILD
新聞熱點
疑難解答