SQL全表扫描
在看有關(guān)SQL優(yōu)化的資料時(shí),常會(huì)看到一個(gè)詞叫 全表掃描。下面來(lái)看一下什么是全表掃描。
全表掃描
在數(shù)據(jù)庫(kù)中,對(duì)無(wú)索引的表進(jìn)行查詢一般稱為全表掃描。
全表掃描是數(shù)據(jù)庫(kù)服務(wù)器用來(lái)搜尋表的每一條記錄的過(guò)程,直到所有符合給定條件的記錄返回為止。
全表掃描是從表中讀取所有行,然后過(guò)濾掉不符合選擇條件的行。
全表掃描的成本 = 表的數(shù)據(jù)塊總數(shù) / 多塊讀取
相對(duì)于索引范圍掃描來(lái)說(shuō),全表掃描的成本是衡定不變的。無(wú)論查詢是想訪問(wèn)一筆數(shù)據(jù)還是訪問(wèn)整個(gè)表的所有數(shù)據(jù),全表掃描都會(huì)把整張表讀出來(lái)。
索引范圍掃描不同,因?yàn)橛辛怂饕@個(gè)有序的數(shù)據(jù)結(jié)構(gòu)做支持,可以只訪問(wèn)需要的索引塊和需要的數(shù)據(jù)塊,而不是訪問(wèn)整張表。
何時(shí)適用全表掃描
1. 單表查詢
? ? 表很小,索引可能就比表還大。
? ? 訪問(wèn)的數(shù)據(jù)占全表數(shù)據(jù)的百分比很大,索引訪問(wèn)的總成本大于全表掃描的成本。
? ? 相對(duì)于索引來(lái)說(shuō),表中的數(shù)據(jù)排列過(guò)于凌亂,表現(xiàn)出來(lái)就是索引的 clustering_factor 很大,導(dǎo)致索引的訪問(wèn)成本劇增。
2. 多表連接
? ? hash join的時(shí)候,內(nèi)層表和外層表都可以使用全表掃描。
? ? nest loop的時(shí)候,外層表可以使用全表掃描,內(nèi)層表一般不用全表掃描。
?
一般對(duì)大表進(jìn)行全表掃描,容易引起SQL查詢效率低。
索引范圍掃描在SQL執(zhí)行計(jì)劃里標(biāo)為 INDEX RANGE SCAN。
總結(jié)
- 上一篇: Win32汇编获取和设置文本框的内容
- 下一篇: SQL Server 替换一个字段的特定