全表掃瞄與索引掃瞄

2022-08-19 10:24:12 字數 1485 閱讀 2299

一,全表掃瞄

全表掃瞄是從讀取資料的同時通過where條件中的查詢條件來過濾來篩選出滿足條件的資料執行過程。其掃瞄的的物件是表中的所有資料塊,包括空資料庫,如果表中的資料大量被刪除,那麼就會存在大量的空資料塊,再次狀態下,大量的空資料塊也被掃瞄。

在執行全表掃瞄時,按照順序每次將多個資料塊從磁碟讀取到記憶體中。在通常情況下,由於資料塊在磁碟的位置都是相互連線的,利用一次讀取多個資料塊的方法,不僅可以提高資料的讀取效率,而且可以降低運輸成本(把乙個資料塊讀取到記憶體中所需要的成本)。

我們知道,對於資料量較小的表,全表掃瞄與索引掃瞄的損益分界點為15%,對於資料量比較大的資料表而言,損益分界點可能小於5%,對於儲存海量資料的表而已,損益分界點可能小於1%。這裡1%指通過索引掃瞄從表中讀取1%的資料,也沒有通過全表掃瞄來讀取資料有效。磁碟技術不斷飛速發展是出現這一現象的原因,尤其是磁碟快取功能的不斷加強使這一現象變的更加明顯。我們從邏輯角度分寫這一現象,索引掃瞄是按照隨機的方式從表中讀取資料,由於滿足條件的資料行被分散儲存在不同的資料塊中,掃瞄這些資料時是通過磁頭的移動來讀取這些資料,而全表掃瞄只需要磁頭順序的掃瞄資料塊將這些資料塊內容讀取到記憶體中,從而使得隨機讀取比順去讀取增加了資料讀取時間。

尤其是並行讀取資料的情況下,全表執行速度得到更大的提高,在這裡需要注意的是在超大型資料表中查詢資料時,盡量不要在滿足查詢條件的查詢範圍比較大的情況下使用索引。選擇使用全表掃瞄的情況;

(1),在索引不存在的情況下使用全表掃瞄。

(2),大範圍資料讀取的情況。

(3),從少量表中讀取資料。

(4),並行處理讀書資料時。

二,索引掃瞄

從利用索引查詢某個資料行的結果看,雖然顯示的是以行為單位的資料,但實際i/o是以資料塊為單位讀取資料的,通過參考以讀入記憶體中的資料塊來查詢滿足條件的行。同樣,查詢優化器在計算成本時並不是以行為基準而是以資料塊為基準的。另外影響索引讀取效率的是聚簇因子(即索引行的順去與表中資料儲存行的順序相似程度)。索引掃瞄型別:

(1),索引唯一掃瞄。

索引唯一掃瞄主要使用在檢索唯一rowid的查詢中,為了進行索引唯一掃瞄必須基於主鍵建立主鍵索引,或者建立唯一索引,且在sql查詢語句中必須使用'='比較運算子。否則索引掃瞄不會使用唯一掃瞄,而會選擇返回掃瞄。

(2),索引範圍掃瞄。

索引返回掃瞄時索引掃瞄中最普遍的掃瞄方式,在使用索引範圍掃瞄時分兩種情況,即有開始值與結束值的情況和有乙個以上的行但沒有結束之的情況。通過該掃瞄方式所檢索出來的行的順序與索引的順序相同,根據此原理可以忽略order by排序。索引範圍掃瞄雖然在最開始為隨機掃瞄,但之後的掃瞄全都是順序掃瞄。在查詢條件中使用=、<、<=、>=、>、between、like等比較運算子情況下選擇索引範圍掃瞄

(3),索引降序範圍掃瞄。

索引降序範圍掃瞄出了是按照降序從資料表讀取資料之外,其他的部分與索引範圍掃瞄相同。

(4),索引跳躍式掃瞄。

(5),索引全掃瞄。

(6),索引快速全掃瞄。

陷阱 SQL全表掃瞄與聚集索引掃瞄

sqlserver中在查詢時,我們為了優化效能,通常會為where條件的字段建立索引,如果條件比較固定還會建立組合索引,接下來,我們來看一下索引與查詢的相關知識及相關陷阱。表自動為主鍵加聚集索引的猜想 我認為應該是對查詢的優化,因為如果聚集 最多只能有乙個 索引的話,在 查詢時,將進行全表掃瞄,反之...

索引 vs 全表掃瞄

之前我們介紹了第乙個檔案格式 檔案格式簡介 在這個檔案格式裡,資料沒有排序,順序儲存,我們只提供了查詢所有資料的介面,當我們想進行值過濾時,比如查詢大於10的資料,需要將所有資料遍歷一遍,如果把這個檔案看做乙個只有一列的表,這種查詢方式就叫全表掃瞄。磁碟的組織結構 碟片 磁軌 扇區。由於碟片是並行操...

全表掃瞄和索引掃瞄的區別

1 全表掃瞄 full table scans,fts 為實現全表掃瞄,oracle讀取表中所有的行,並檢查每一行是否滿足語句的where限制條件。oracle順序地讀取分配給表的每個資料塊,直到讀到表的最高水線處 high water mark,hwm,標識表的最後乙個資料塊 乙個多塊讀操作可以使...