淺談 Index Seek 和 Scan
在這邊我們來稍微談一下,什麼是Index Seek 、Index Scan以及Table Scan、Index Scan。真是感嘆世態炎涼阿,有好就有壞,有壞不一定就有好,大家可以看出我標題為何只寫「Index Seek 和Scan」嗎?,原因事是Seek 只有在建Index後才會有可能的發生的事,並且建了Index後,系統可不一定就會用Seek的方式找資料唷,但是若沒建Index 那就一定沒有Seek可以玩啦。
所謂的Scan ,是指查詢後以整個資料表或整個索引的方式讀取資料,而Seek是指在已經排序過的實體資料中,以取一筆或一個區間資料的方式讀取連續性的資料,這聽起來像是再繞口令,大家還是可以從字面上的意思,瞭解其固中的道理。不過,在此我還是以圖形的方式來表達一下好了,請參考下圖。
(圖4)
如上圖,若KEY未經過排序時,系統讀取資料是以逐筆的方式進行,將KEY=2的資料讀取出來,若索引的排序件值與Where 條件不一致,也會發生這樣的情形喔,所以索引的鍵值與查詢的條件可真是密不可分阿。
接下來談談Seek,Seek只有在當實體資料有經過排序後才有的讀取方式,因為已經建立過索引,所以可以透過索引內的指標直接指到對應的資料列,並且讀取連續的區間資料,中間不會花任何時間讀取其他資料。承上例,假設我們已經以KEY欄位鍵過Clustered Index,請參考下圖資料讀取的方式。
如上圖,應該可以看得出讀取資料的箭頭變短了,系統只讀取三筆資料就結束了,因為之後的可以確定是不符合資料的記錄,系統就不多作讀取的動作,可節省不少時間喔。
接下來我們來介紹幾種資料搜尋的方式:
一、Table Scan(資料表掃描):
這種掃描的方式,是在當一個資料表沒有建立任何Clustered Index 時所採取的資料搜尋方式,也就是實體資料以Heap架構存放時的處理方式。
二、Clustered Index Scan(叢集索引掃描):
這種搜尋方式,是當資料表有建立叢集索引鍵,但是在找詢資料時並非有效的利用到實體資料排序。