在資料庫中,對無索引的表進行查詢一般稱為全表掃描。全表掃描是資料庫伺服器用來搜尋表的每一條記錄的過程,直到所有符合給定條件的記錄返回為止。
基本介紹
全表掃描的成本,全表掃描的穩定性,何時適用全表掃描,
全表掃描的成本
全表掃描的成本 = 表的數據塊總數 / 多塊讀取
一般說來資料庫在進行全表掃描時進行的是多塊讀取,也就是說每次從buffer cache中讀取多塊,而不是一次一塊的讀。另外,全表掃描的成本中並不包括對數據進行過濾和計算的成本。也就是說全表掃描的成本僅僅是讀取數據的成本,而不包含對數據進行計算,過濾的CPU成本。
全表掃描的穩定性
相對於索引範圍掃描來說,全表掃描的成本是衡定不變的。無論你的查詢是想訪問一筆數據還是訪問整個表的所有數據,全表掃描都會把整張表讀出來。而索引範圍掃描就不同,因為有了索引這個有序的數據結構做支持,可以只訪問需要的索引塊和需要的數據塊,而不是訪問整張表。
何時適用全表掃描
1. 單表查詢
※ 表很小,索引可能就比表還大。
※ 訪問的數據占全表數據的百分比很大,索引訪問的總成本大於全表掃描的成本。
※ 相對於索引來說,表中的數據排列過於凌亂,表現出來就是索引的 clustering_factor 很大,導致索引的訪問成本劇增。
2. 多表連線
※ hash join的時候,內層表和外層表都可以使用全表掃描(對於某個單獨的表的訪問是否適用全表掃描,這個又回到了單表查詢的情況)。
※ nest loop的時候,外層表可以使用全表掃描,內層表一般不用全表掃描。