發生原因

索引破碎是甚麼?在介紹叢集索引搜索時有提到索引破碎,這邊我們就來解釋索引破碎的發生和條件,其實簡單來說索引破碎就是資料不連貫導致硬碟讀取變慢,通常會發生在刪除資料或是插入新資料的時候

舉例來說字典如果要加入新的文詞時必須找到該部首或注音的範圍在寫入,但資料庫不會這麼做因為資料庫在有索引的情況下為了加速會將資料排序過儲存,如果插入的資料很不幸運的在排序靠前面的資料而剛好運氣更不好的是資料表中有足足500萬筆資料,資料庫會在資料範圍的後方先加上標記,並在資料表最後面插入資料,乍聽之下好像沒問題,但稍微想一下你要找到該範圍資料必須在讀到一半時先跳過 500 萬筆資料之後再開始讀取後半部新增的資料,那資料庫應該怎麼樣都快不起來了。

所以索引也是要做維護的,對你沒聽錯索引要做定期維護的,那要如何維護我們後續再解說,但這之前我們必須先知道索引破碎其實有分內部破碎和外部破碎,讓我們來了解外部破碎和內部破碎的差異和嚴重性與他發生原因

內部破碎

發生原因

內部破碎通常發生在刪除資料時,讓資料在讀取時中間有空資料範圍進而導致資料不連貫有段落存在。但內部破碎情況較少出現因為正式環境下通常都不刪資料,這樣應該會想問那內部破碎會發生嗎?對!所以正式環境下通常都不太會發生,但也不能說不會發生,只是要了解到底內部破碎發生的情況和為甚麼會發生,有時某些情況下會故意利用內部破碎來減緩外部破碎的發生,說起來有點像事先預由一些空間給後續要新增的,這部分後續會在說明。

外部破碎

外部破碎的發生就是像我們剛才提到的例子通常發生插入新資料時,如果插入的資料很不幸的在排序靠前面的資料而資料庫資料量也較龐大時,資料庫會在該資料區間範圍標記並將資料,這個就外部破碎如果要讀該資料範圍必須先跳過後方非該範圍資料才能讀到相同資料範圍的資料,這也是索引中最嚴重的情況,而很不幸的是我們的資料表時常在做新增資料,因為資料庫就是用來儲存資料的。

想必到這邊應該就想法了,前面有提到了內部破碎是因為刪除資料而照成資料不連貫有段落,而外部破碎是資料因為沒地方插入所以補在後面,也就是說我們可以利用內部破碎的特性,讓索引在每個分頁內遇留下我們可以忍受的空間,來讓資料在插入時有空間可以存在相同範圍內,來減緩外部破碎發生的時間。

聽好了是 ””” **減緩 減緩 減緩 ”””**很重要所以說三遍

所以不要想說只要使用內部破碎就能完全解決索引破碎的問題,預留的空間終究會有用完的時候,這是無法避免的所以還是乖乖定期保養做好維護計畫。

維護索引

其實解決的索引破碎的方式簡單來說就是把索引重新排序過,既然排序亂掉就重新排序就可以了,但這會花上一點時間及CPU效能,因為資料庫要對整張資料表重新排序,所以建議離峰時間點做維護,而 SQL Server Managment Service 有提供維護計畫精靈,能夠透過和自動化排成去維護索引

SQL Server Managment Service 維護精靈

Image 1.png

Image 2.png

索引重組語法