Oracle資料庫不能使用索引的原因定

2021-08-27 06:54:32 字數 2500 閱讀 4592

2012-04-25 00:00

中國it實驗室

佚名

oracle

資料庫有時候出現不能使用索引的現象,出現該現象的原因有很多,該怎麼去定位呢?本文我們主要就介紹這一部分內容。

首先,我們要確定資料庫執行在何種優化模式下,相應的引數是: 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 掌。

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

第十,看是否有用到並行查詢( pqo )。並行查詢將不會用到索引。如我們想要用到a 表的ind_col1 " select * from a where col1 = ***;"注意,注釋符必須跟在select之後,且注釋中的" + "要緊跟著注釋起始符" /* "或" -- ",否則 hint 就被認為是一般注釋,對 pl/sql 語句的執行不產生任何影響。

一種是 explain table 方式。

使用者必須首先在自己的模式( schema )下,建立 plan_table 表,執行計畫的每一步驟都將記錄在該表中,建表 sql 指令碼為在 $/rdbms/admin/ 下的 utlxplan.sql 開啟 sql*plus ,輸入" set autotrace on ",然後執行待除錯的 sql 語句。在給出查詢結果後, oracle 將顯示相應的"執行計畫",包括優化器型別、執行代價、連線方式、連線順序、資料搜尋路徑以如果我們不能確定需要跟蹤的具體 sql 語句,比如某個應用使用一段時間後,響應速度忽然變慢。我們這時可以利用 oracle 提供的另乙個有力工具 tkprof ,對應用的執行過程全程跟蹤。

我們要先在系統檢視 v$session 中,可根據 userid 或 machine ,查出相應的 sid 和 serial# .以sys 或其他有執行 dbms_system 程式包的使用者連線資料庫,執行" execute dbms_system.set_sql_trace_in_session ( sid , serial# , true );".然後執行應用程式,這時在伺服器端,資料庫參" user_dump_dest "指示的目錄下,會生成 ora__***x.trc 檔案,其中 ***x 為被跟蹤應用的作業系統程序號。應用程式執行完成後,用命令 tkprof 對該檔案進行分析。

命令示例:" tkprof tracefile outputfile explain=userid/password" .在作業系統 oracle 使用者下,鍵入" tkprof ",會有詳細的命令幫助。分析後的輸出檔案 outputfile 中,有每一條 pl/sql 語句的"執行計畫"、 cpu 占用、物理讀次數、邏輯讀次數、執行時長等重要資訊。根據輸出檔案的資訊,我們可以很快發現應用中哪條 pl/sql 語句是問題的癥結所在。

關於oracle資料庫不能使用索引的原因定位就介紹到這裡了,希望本次的介紹能夠對您有所幫助。

oracle 不能使用for update

select from table name for update 造成oracle資料庫卡死 1 首先查詢出問題表的session id select session id from v locked object l join dba objects o on l.object id o.obj...

Oracle資料庫索引

標籤 資料庫 oracle 索引index 2013 06 14 16 54 4148人閱讀收藏 舉報 database 6 目錄 索引基本概念 索引的作用 索引的架構 oracle索引的型別 1 基於函式的索引 2 位圖索引 oracle索引的實現 索引是用於加速資料訪問的資料物件,合理的使用索引...

Oracle資料庫 索引

索引通過指標的形式提高資料查詢的速度。如果乙個資料量比較大的資料庫經常被查詢而插入刪除的次數較少,則應該建立索引,相反,小表或經常被插入或修改,則不建議建立索引。1.建立索引 create index emp phone number ix on employees phone number 2.建...