1. 程式人生 > >sqlserver重建(rebuild)索引可以提高查詢速度

sqlserver重建(rebuild)索引可以提高查詢速度

當隨著表的資料量不斷增長,很多儲存的資料進行了不適當的跨頁(sqlserver中儲存的最小單位是頁,頁是不不可再分的),會產生很多索引的碎片。這時候需要重建索引來提高查詢效能。

如何檢視索引的使用情況:
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_percent
FROM 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%就需要重建索引,可以減少IO掃描操作。

重建索引:
alter index pk_my_users on my_users rebuild;

測試結果:

原來的碎片達到89%,重建索引碎片降到2%,查詢速度快了1倍。(資料量為百萬級)

記得2004年開始做DBA不久,重建一個8000萬資料量的大表的索引,
我當時很傻很傻,計劃:
drop index 然後準備create index,
結果,當drop index之後,資料庫不響應了,系統太依賴這張表了,很多訪問等待了,天哪!!

現在懂了,重建索引要
alter index xxxx rebuild;

小心呀,那一次,讓我到現在都難以忘記當時系統不能訪問的慌張,這可是公司最核心的資料庫!

——索引對select沒有壞處,只有好處,但對DML(delete,update,insert)有壞處,增加了IO開銷,而且索引本身的結果也會不斷的變差,至於適不適合需要結合具體情況分析,對各種操作做一個權衡取捨!

弱弱的問一下,在rebuild索引的過程中,訪問該索引對應的基表時,索引能使用否。
——應該可以,因為rebuild是保留以前的索引樹,通過這個索引樹構建新的平衡索引樹,所以之前的索引樹存在切可用

http://lusanxiong.iteye.com/blog/1544950