[SQL]淺談索引(二)

[SQL]淺談索引(二) -叢集索引

本篇文章會使用到SSMS的「圖形化執行計畫」,並對叢集索引進行簡單得查詢測試。

執行計畫快取:

執行計畫可能被快取,所以後來執行的TSQL會使用到前面的執行計畫,可以使用以下語法清除執行計畫快取

--移除執行計畫快取
DBCC FREEPROCCACHE;  

搜尋(Seek)與掃描(Scan):

在圖形化執行計畫中,主要觀察的項目就是「XXX掃描」或「XXX搜尋」,那麼搜尋(Seek)與掃描(Scan)有什麼不同?

掃描(Scan):逐筆掃描整個資料表或整個索引,將符合的資料讀出。

搜尋(Seek):在使用B-Tree資料結構排序過的資料中尋找符合的資料。


接著先看看範例資料表

資料表MT共有5個欄位並建立了索引

叢集索引: 1. BatchID  2. OrderNo 

非叢集索引: Subject

測試一:當查詢時沒有任何查詢參數會使用叢集索引掃描的方式(Scan)。

SELECT No,BatchID,OrderNo,Subject,MsgBody FROM dbo.MT

測試二:查詢參數使用叢集索引鍵中的第一個欄位則會使用叢集索引搜尋的方式(Seek)。

SELECT No,BatchID,OrderNo,Subject,MsgBody FROM dbo.MT WHERE BatchID = 'No1'

 

測試三:查詢參數沒有使用叢集索引鍵中的第一個欄位,而直接使用第二個欄位則會是叢集索引掃描的方式(Scan)。

SELECT No,BatchID,OrderNo,Subject,MsgBody FROM dbo.MT WHERE OrderNo = 2 

測試四:查詢參數使用了叢集索引鍵中的第一個欄位,即使查詢參數還包含其他非叢集索引的欄位則該次查詢是使用叢集索引搜尋的方式(Seek)。

SELECT No,BatchID,OrderNo,Subject,MsgBody FROM dbo.MT WHERE BatchID = 'No2' AND Subject = '驗證碼'


※叢集索引掃描:搜尋方式就會掃描過整個叢集索引,當資料量大時查詢效率就會很不好。

※叢集索引搜尋:最有效率的搜尋方式,利用叢集索引所建立的實體資料排序。

※叢集索引的使用是有順序型的,假設今天叢集索引鰎中有3個欄位分別是A、B、C,當查詢時的WHERE 使用了 A、C,跳過了B則會使用Scan的搜尋方式。

egan2608@gmail.com