哪些情況會引起/要求全表掃描?

一. 何時適用全表掃描(正面)

  1. 單表查詢
    表很小,索引可能就比表還大;
    訪問的數(shù)據(jù)占全表數(shù)據(jù)的百分比很大,索引訪問的總成本大于全表掃描的成本;
    相對于索引來說,表中的數(shù)據(jù)排列過于凌亂,表現(xiàn)出來就是索引的 clustering_factor 很大,導致索引的訪問成本劇增。
  2. 多表連接
    hash join的時候,內層表和外層表都可以使用全表掃描(對于某個單獨的表的訪問是否適用全表掃描,這個又回到了單表查詢的情況);
    nest loop的時候,外層表可以使用全表掃描,內層表一般不用全表掃描。

二. SQL語句使用不當(負面)

  1. 模糊查詢
    只有右模糊可以成功利用索引;
    左模糊和全模糊都不能成功利用索引。
  2. 查詢條件中含有is null
    原因:導致單索引失效;
    解決辦法:
    索引列避免is null;
    使用組合索引。
  3. 查詢條件中使用了不等于從操作符<>、!=
    原因:不等于操作符限制了索引,即使字段上有索引;
    解決方法:把不等于改成OR。
column<>’aaa’ //全表掃描
column<’aaa’ OR column>’aaa’ //使用索引
  1. OR語句使用不當
    OR語句連接的條件中包含的列沒有全部建立索引。
  2. 組合索引使用不當
    查詢條件中沒有前導列,導致索引不起作用;
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; //使用組合索引
  1. UPDATA語句updata了全部字段
  2. 對于多張大數(shù)據(jù)量的表JOIN
    原因:沒有先分頁,導致邏輯讀很高;
    解決方法:先分頁再JOIN。
  3. SELECT COUNT(*)
  4. 對于反復執(zhí)行的查詢,WHERE子句中使用變量綁定可以降低解析時間,提高性能。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容