oracle sql优化案例一:使用了表达式不会使用索引
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