sql優化案例一:使用了表示式不會使用索引

paulyibinyi發表於2008-09-27

   最近在客戶那做資料庫效能調優時,發現一些程式開發的sql 寫法確實不好,導致

     使用不上索引,佔用cpu過高,而影響應用,資料庫採用的是RBO模式

     以下是一個測試方法;

      在開發中 sql寫法類式是

        select  * from test  where test_date+1>to_date('2008-09-26','yyyy-mm-dd');

     這樣就不會用上索引

     而改成下面這樣就可以用上

       select  * from test  where test_date>to_date('2008-09-26','yyyy-mm-dd')-1;

SQL> select * from test where test_date+1>to_date('2008-09-25','yyyy-mm-dd');

        ID TEST_DATE
---------- ----------
         1 27-9月 -08
         1 26-9月 -08
         1 25-9月 -08
         1 25-9月 -08


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE
   1    0   TABLE ACCESS (FULL) OF 'TEST'

 


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         16  consistent gets
          0  physical reads
          0  redo size
        493  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          4  rows processed

SQL> select * from test where test_date>to_date('2008-09-25','yyyy-mm-dd')-1;

        ID TEST_DATE
---------- ----------
         1 25-9月 -08
         1 25-9月 -08
         1 26-9月 -08
         1 27-9月 -08


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST'
   2    1     INDEX (RANGE SCAN) OF 'IDX_TEST' (NON-UNIQUE)

 


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          6  consistent gets
          0  physical reads
          0  redo size
        493  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          4  rows processed

SQL>

 

一致性讀從16降到6,目前測試的資料量比較小,但如果資料量很大,那將是一個

很大的效能提升

 

以下幾種操作會顯示的阻止oracle使用索引

2, f1 is null, f1 is not null, f1 not in, f1 !=, f1 like ‘%pattern%’;

3, Not exist

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7199859/viewspace-464608/,如需轉載,請註明出處,否則將追究法律責任。

相關文章