一. 何時(shí)適用全表掃描(正面)
- 單表查詢
表很小矮锈,索引可能就比表還大霉翔;
訪問的數(shù)據(jù)占全表數(shù)據(jù)的百分比很大,索引訪問的總成本大于全表掃描的成本苞笨;
相對(duì)于索引來說债朵,表中的數(shù)據(jù)排列過于凌亂子眶,表現(xiàn)出來就是索引的 clustering_factor 很大,導(dǎo)致索引的訪問成本劇增序芦。 - 多表連接
hash join的時(shí)候臭杰,內(nèi)層表和外層表都可以使用全表掃描(對(duì)于某個(gè)單獨(dú)的表的訪問是否適用全表掃描,這個(gè)又回到了單表查詢的情況)谚中;
nest loop的時(shí)候渴杆,外層表可以使用全表掃描,內(nèi)層表一般不用全表掃描宪塔。
二. SQL語句使用不當(dāng)(負(fù)面)
- 模糊查詢
只有右模糊可以成功利用索引磁奖;
左模糊和全模糊都不能成功利用索引。 - 查詢條件中含有
is null
原因:導(dǎo)致單索引失效某筐;
解決辦法:
索引列避免is null
比搭;
使用組合索引。 - 查詢條件中使用了不等于從操作符
<>
来吩、!=
原因:不等于操作符限制了索引敢辩,即使字段上有索引;
解決方法:把不等于改成OR
弟疆。
column<>’aaa’ //全表掃描
column<’aaa’ OR column>’aaa’ //使用索引
-
OR
語句使用不當(dāng)
OR
語句連接的條件中包含的列沒有全部建立索引戚长。 - 組合索引使用不當(dāng)
查詢條件中沒有前導(dǎo)列,導(dǎo)致索引不起作用怠苔;
create index skip1 on emp5(job,empno);
select count(*) from emp5 where empno=7900; //全表掃描
select /*+ index(emp5 skip1)*/ count(*) from emp5 where empno=7900; //使用組合索引
使用組合索引時(shí)同廉,在排序時(shí)應(yīng)按照組合索引中各列順序進(jìn)行排序(即使只有一個(gè)列需要排序),否則性能較差柑司。
create index skip1 on emp5(job,empno迫肖,date);
select job,empno from emp5 where job=’manager’and empno=’10’ ORDER BY date desc; //性能較差
select job攒驰,empno from emp5 where job=’manager’and empno=’10’ ORDER BY job,empno,date desc; //使用組合索引
-
UPDATA
語句updata了全部字段 - 對(duì)于多張大數(shù)據(jù)量的表
JOIN
原因:沒有先分頁(yè)蟆湖,導(dǎo)致邏輯讀很高;
解決方法:先分頁(yè)再JOIN
玻粪。 SELECT COUNT(*)
- 對(duì)于反復(fù)執(zhí)行的查詢隅津,
WHERE
子句中使用變量綁定可以降低解析時(shí)間,提高性能劲室。