1. 程式人生 > >表裡有索引,為什麼還都是全表掃描?

表裡有索引,為什麼還都是全表掃描?

這是有CBO根據執行計劃的成本決定的

exec dbms_stats.gather_table_stats(ownname='test',tabname=>'dept',cascade=>true);

用/*+ index(table_name index_name) */的HINT來強制走索引。
如:select /*+ index(emp pk_emp) */ from emp where empno=7934;

前提是你要了解應用,知道哪些語句走索引比較高效,否則效果適得其反。

===========

偉大的Oracle SQL優化器可以判斷出在某些情況下,使用全表掃描比使用
索引掃描
能更快的得到資料結果。

有沒有想過,她是怎麼做到的呢?
背後的原理是什麼呢?

舉一個非常好理解的場景(scenario:通過索引讀取表中20%的資料)解釋一下這個有趣的概念

假設一張表含有10萬行資料--------100000行
我們要讀取其中20%(2萬)行資料----20000行
表中每行資料大小80位元組----------80bytes
資料庫中的資料塊大小8K----------8000bytes
所以有以下結果:
每個資料塊包含100行資料---------100行
這張表一共有1000個數據塊--------1000塊

上面列出了一系列淺顯易懂的資料,我們挖掘一下這些資料後面的故事:

通過索引讀取20000行資料 = 約20000個table access by rowid = 需要處理20000個塊來執行這個查詢

但是,請大家注意:整個表只有1000個塊!
所以:如果按照索引讀取全部的資料的20%相當於將整張表平均讀取了20次!!So,這種情況下直接讀取整張表的效率會更高。很幸運,Oracle也是這麼想的:)

-- The End --