Oracle索引使用規則

2021-09-01 01:28:48 字數 1966 閱讀 3529

首先,我們要確定資料庫執行在何種優化模式下,相應的引數是:optimizer_mode。可在svrmgrl中執行「show parameter optimizer_mode"來檢視。oracle v7以來預設的設定應是"choose",即如果對已分析的表查詢的話選擇cbo,否則選擇rbo。如果該引數設為「rule」,則不論表是否分析過,一概選用rbo,除非在語句中用hint強制。

查詢原因的步驟

首先,我們要確定資料庫執行在何種優化模式下,相應的引數是:optimizer_mode。可在svrmgrl中執行「show parameter optimizer_mode"來檢視。oracle v7以來預設的設定應是"choose",即如果對已分析的表查詢的話選擇cbo,否則選擇rbo。如果該引數設為「rule」,則不論表是否分析過,一概選用rbo,除非在語句中用hint強制。

其次,檢查被索引的列或組合索引的首列是否出現在pl/sql語句的where子句中,這是「執行計畫」能用到相關索引的必要條件。

第三,看採用了哪種型別的連線方式。oracle的共有sort merge join(smj)、hash join(hj)和nested loop join(nl)。在兩張表連線,且內錶的目標列上建有索引時,只有nested loop才能有效地利用到該索引。smj即使相關列上建有索引,最多只能因索引的存在,避免資料排序過程。hj由於須做hash運算,索引的存在對資料查詢速度幾乎沒有影響。

第四,看連線順序是否允許使用相關索引。假設表emp的deptno列上有索引,表dept的列deptno上無索引,where語句有emp.deptno=dept.deptno條件。在做nl連線時,emp做為外表,先被訪問,由於連線機制原因,外表的資料訪問方式是全表掃瞄,emp.deptno上的索引顯然是用不上,最多在其上做索引全掃瞄或索引快速全掃瞄。

第五,是否用到系統資料字典表或檢視。由於系統資料字典表都未被分析過,可能導致極差的「執行計畫」。但是不要擅自對資料字典表做分析,否則可能導致死鎖,或系統效能下降。

第六,索引列是否函式的引數。如是,索引在查詢時用不上。

第七,是否存在潛在的資料型別轉換。如將字元型資料與數值型資料比較,oracle會自動將字元型用to_number()函式進行轉換,從而導致第六種現象的發生。

第八,是否為表和相關的索引蒐集足夠的統計資料。對資料經常有增、刪、改的表最好定期對錶和索引進行分析,可用sql語句「analyze table ***x compute statistics for all indexes;"。oracle掌握了充分反映實際的統計資料,才有可能做出正確的選擇。

第九,索引列的選擇性不高。

我們假設典型情況,有表emp,共有一百萬行資料,但其中的emp.deptno列,資料只有4種不同的值,如10、20、30、40。雖然emp資料行有很多,oracle預設認定表中列的值是在所有資料行均勻分布的,也就是說每種deptno值各有25萬資料行與之對應。假設sql搜尋條件deptno=10,利用deptno列上的索引進行資料搜尋效率,往往不比全表掃瞄的高,oracle理所當然對索引「視而不見」,認為該索引的選擇性不高。

但我們考慮另一種情況,如果一百萬資料行實際不是在4種deptno值間平均分配,其中有99萬行對應著值10,5000行對應值20,3000行對應值30,2000行對應值40。在這種資料分布圖案中對除值為10外的其它deptno值搜尋時,毫無疑問,如果索引能被應用,那麼效率會高出很多。我們可以採用對該索引列進行單獨分析,或用analyze語句對該列建立直方圖,對該列蒐集足夠的統計資料,使oracle在搜尋選擇性較高的值能用上索引。

第十,索引列值是否可為空(null)。如果索引列值可以是空值,在sql語句中那些需要返回null值的操作,將不會用到索引,如count(*),而是用全表掃瞄。這是因為索引中儲存值不能為全空。

第十一,看是否有用到並行查詢(pqo)。並行查詢將不會用到索引。

第十二,看pl/sql語句中是否有用到bind變數。由於資料庫不知道bind變數具體是什麼值,在做非相等連線時,如「<」,「>」,「like」等。oracle將引用預設值,在某些情況下會對執行計畫造成影響。

Oracle索引使用規則

首先,我們要確定資料庫執行在何種優化模式下,相應的引數是 optimizer mode。可在svrmgrl中執行 show parameter optimizer mode 來檢視。oracle v7以來預設的設定應是 choose 即如果對已分析的表查詢的話選擇cbo,否則選擇rbo。如果該引數設...

oracle 索引,基本規則

建立索引常用的規則如下 1 表的主鍵 外來鍵必須有索引 2 資料量超過300的表應該有索引 3 經常與其他表進行連線的表,在連線欄位上應該建立索引 4 經常出現在where子句中的字段,特別是大表的字段,應該建立索引 5 索引應該建在選擇性高的字段上 6 索引應該建在小字段上,對於大的文字字段甚至超...

Oracle索引優化規則

索引優化規則 1.like件中不要以萬用字元 wildcard 開始,否則索引將不被採用.例 select lodging from lodging where manager like hanman 2.避免在索引列上使用計算或改變索引列的型別或使用 及 例 select from dept wh...