一. 何時適用全表掃描(正面)
- 單表查詢
表很小,索引可能就比表還大;
訪問的數(shù)據(jù)占全表數(shù)據(jù)的百分比很大,索引訪問的總成本大于全表掃描的成本;
相對于索引來說,表中的數(shù)據(jù)排列過于凌亂,表現(xiàn)出來就是索引的 clustering_factor 很大,導致索引的訪問成本劇增。 - 多表連接
hash join的時候,內層表和外層表都可以使用全表掃描(對于某個單獨的表的訪問是否適用全表掃描,這個又回到了單表查詢的情況);
nest loop的時候,外層表可以使用全表掃描,內層表一般不用全表掃描。
二. SQL語句使用不當(負面)
- 模糊查詢
只有右模糊可以成功利用索引;
左模糊和全模糊都不能成功利用索引。 - 查詢條件中含有
is null
原因:導致單索引失效;
解決辦法:
索引列避免is null;
使用組合索引。 - 查詢條件中使用了不等于從操作符
<>、!=
原因:不等于操作符限制了索引,即使字段上有索引;
解決方法:把不等于改成OR。
column<>’aaa’ //全表掃描
column<’aaa’ OR column>’aaa’ //使用索引
-
OR語句使用不當
OR語句連接的條件中包含的列沒有全部建立索引。 - 組合索引使用不當
查詢條件中沒有前導列,導致索引不起作用;
create index skip1 on emp5(job,empno);
select count(*) from emp5 where empno=7900; //全表掃描
select /*+ index(emp5 skip1)*/ count(*) from emp5 where empno=7900; //使用組合索引
使用組合索引時,在排序時應按照組合索引中各列順序進行排序(即使只有一個列需要排序),否則性能較差。
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了全部字段 - 對于多張大數(shù)據(jù)量的表
JOIN
原因:沒有先分頁,導致邏輯讀很高;
解決方法:先分頁再JOIN。 SELECT COUNT(*)- 對于反復執(zhí)行的查詢,
WHERE子句中使用變量綁定可以降低解析時間,提高性能。