sql优化案例一:使用了表达式不会使用索引

   最近在客户那做数据库性能调优时,发现一些程序开发的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

 

请使用浏览器的分享功能分享到微信等