oracle order by索引是否使用的情況

風靈使發表於2018-04-16

剛開始在網上看了很多說order by 走索引有兩個前提條件

1,ORDER BY中所有的列必須包含在相同的索引中並保持在索引中的排列順序.

2,ORDER BY中所有的列必須定義為非空.

下面是測試:

建表:

    create table person  
    (  
      id          VARCHAR2(50) not null,  
      name   VARCHAR2(20) not null,  
      phone VARCHAR2(11) not null,  
      time  TIMESTAMP(6) not null  
      )  

建立索引

create index index_person on person(time,phone);

執行語句測試:

1,

select  * from  person   
       where 1=1    
        and time <= to_date('2013-12-12 12:12:12','yyyy-MM-dd hh24:mi:ss')   
        and phone = '13892441321'  
        order by time desc           --使用索引  

2,

select  * from  person order by time desc --不使用索引  

這個有個特別的情況:

1,

select  * from  person   
         where 1=1    
         and phone = '13892441321'  
         order by time desc           --使用索引  

2,

select  * from  person   
         where 1=1    
         and phone = '13892441321'     --不使用索引  

這種情況是加了個order by time才使用了索引,我的理解是隻有一個條件phone的時候索引無效,加了order by time ,才用到了索引

分頁的時候使用索引,例如:
1,

select  * from  person   
         order by time desc           --不使用索引  

2,

select * from (  
          select  * from  person   
          order by time desc)         --這裡換成order by phone也是不走索引的,這個是索引的字首原則。  
        where rownum <=1000           --使用索引  

總結:其實order by 滿足以上的兩個條件後,決定走不走索引的還要看where後面的條件,先要where條件符合,走了索引才行。上面的第二條沒加條件,顯然是不使用索引的。很多時候建立索引要看具體業務需求,也就是查詢條件。走不走索引,主要是測試一下,看看執行計劃。

假如一定要對使用函式的列啟用索引, ORACLE新的功能: 基於函式的索引(Function-Based Index) 也許是一個較好的方案.

     CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基於函式的索引*/

     SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL'; /*將使用索引*/   

5 怎樣監控無用的索引   

Oracle 9i以上,可以監控索引的使用情況,假如一段時間內沒有使用的索引,一般就是無用的索引   

語法為:   


 開始監控:alter index index_name monitoring usage;

 檢查使用狀態:select * from v$object_usage; 

 停止監控:alter index index_name nomonitoring usage;   

當然,假如想監控整個使用者下的索引,可以採用如下的指令碼:

set heading off set echo off set feedback off set pages 10000 spool start_index_monitor.sql   SELECT 'alter index 'owner'.'index_name' monitoring usage;' FROM dba_indexes WHERE owner = USER; spool off set heading on set echo on set feedback on set heading off set echo off set feedback off set pages 10000 spool stop_index_monitor.sql SELECT 'alter index 'owner'.'index_name' nomonitoring usage;' FROM dba_indexes WHERE owner = USER; spool off set heading on set echo on set feedback on

其實最好的辦法是檢視執行計劃。

相關文章