問:使用nc掃瞄運算子,有方法知道索引是怎麼掃瞄的麼?
這個問題的乙個答案是非聚集索引掃瞄總是掃瞄整個索引。
答:是的,總是100%。掃瞄運算子總是整個索引……
但是有一些特定的情況並不是這樣。在這篇文章裡我想專門講下你總會碰到的乙個特定案例——在你的查詢裡有top,min或者max表示式。
我們來看下面2個查詢。
1第1個查詢從person .person表返回前10行,第2個查詢返回businessentityid列的最小和最大值。當你看執行計畫結果時,你會看到有趣的東西:select
top10
*from
person.person2go
34select
5min(businessentityid) as
'min',
6max(businessentityid) as
'max'7
from
person.person
8go
第1個查詢「掃瞄」聚集索引來獲得前10行,對於第2個查詢,聚集索引也被「掃瞄」2次來獲得businessentityid的最小值和最大值。但在這些情況裡聚集索引掃瞄(clustered index scan)並不是真正的聚集索引全掃瞄,因為top運算子縮短了聚集索引掃瞄(clustered index scan)。這是什麼意思呢?
一般來說,你知道你應該從右到左閱讀執行計畫,因為執行計畫裡的行也是從右流向左的。但在執行計畫執行期間,是從左往右執行的。sql server內部使用所謂的迭代器模式(iterator-model),在那裡執行計畫裡每個運算子從右邊的運算子請求新的行。下圖說明了這個非常重要的概念。
因為這個迭代器,最後的資料流是從右到左。現在當你看剛才生成的執行計畫,你可以看到top運算子有所謂的top表示式(top expression):
對於第1個查詢top表示式是10,對於第2個執行計畫裡的2個top表示式是1。這個top表示式就定義top運算子消耗從右邊的輸入運算子的行數。當第1個查詢裡top運算子已消耗10行(前10行)後,top運算子就會縮短執行計畫,且不會返回更多的行給select運算子,這就意味著查詢執行計畫已經最終結束了。
同樣的事情發生在第2個執行計畫。為了獲得businessentityid的最小值(聚集鍵值),top運算子只消耗來自向前聚集索引掃瞄(forward clustered index scan)的第1行,最大值只消耗來自向後聚集索引掃瞄(backward clustered index scan)的第1行。
當你在執行計畫裡看到top運算子,你總要想下這個特定場景:top運算子只會縮短你的掃瞄運算子。因此結論就是:在執行計畫裡,掃瞄並不總是掃瞄。
感謝關注!
Index Scans 索引掃瞄
官方文件鏈結位址 select department id,last name,salary from employees where salary 5000 order by department id,last name 50,atkinson,2800,rowid 60,austin,4800...
索引查詢和索引掃瞄
索引的訪問方式主要是 索引查詢 索引掃瞄。在執行計畫中為 index seek,適用於查詢少量資料。對應隨機io,能快速的定位一條資料。在執行計畫中為 index scan,適合掃瞄整個索引的資料。類似於全表掃瞄 只掃瞄索引 對應順序io,io效率本身比較高。索引查詢 和 索引掃瞄,單從io效率上來...
全表掃瞄與索引掃瞄
一,全表掃瞄 全表掃瞄是從讀取資料的同時通過where條件中的查詢條件來過濾來篩選出滿足條件的資料執行過程。其掃瞄的的物件是表中的所有資料塊,包括空資料庫,如果表中的資料大量被刪除,那麼就會存在大量的空資料塊,再次狀態下,大量的空資料塊也被掃瞄。在執行全表掃瞄時,按照順序每次將多個資料塊從磁碟讀取到...