首页 > Oracle > 优化Oracle的SQL语句(五)

优化Oracle的SQL语句(五)

2009年6月18日 admin 发表评论 阅读评论

第十一 like子句尽量前端匹配

因为like参数使用的非常频繁,因此如果能够对like子句使用索引,将很高的提高查询的效率。

例6:select * from city where name like ‘%S%’

以上查询的执行计划用了全表扫描(TABLE ACCESS FULL),如果能够修改为:

select * from city where name like ‘S%’

那么查询的执行计划将会变成(INDEX RANGE SCAN),成功的利用了name字段的索引。这意味着Oracle SQL优化器会识别出用于索引的like子句,只要该查询的匹配端是具体值。因此我们在做like查询时,应该尽量使查询的匹配端是具体值,即使用like ‘S%’。

第十二 用Case语句合并多重扫描

我们常常必须基于多组数据表计算不同的聚集。例如下例通过三个独立查询:

例8:1)select count(*) from emp where sal<1000;
     2)select count(*) from emp where sal between 1000 and 5000;
     3)select count(*) from emp where sal>5000;

这样我们需要进行三次全表查询,但是如果我们使用case语句:

select
count (sale when sal <1000 then 1 else null end) count_poor,
count (sale when between 1000 and 5000 then 1 else null end) count_blue_collar,
count (sale when sal >5000 then 1 else null end) count_poor
from emp;

这样查询的结果一样,但是执行计划只进行了一次全表查询。

第十三 使用nls_date_format

例9:

select * from record where  to_char(ActionTime,’mm’)=’12′

这个查询的执行计划将是全表查询,如果我们改变nls_date_format,
SQL>alert session set nls_date_formate=’MM’;

现在重新修改上面的查询:

select * from record where  ActionTime=’12′

这样就能使用actiontime上的索引了,它的执行计划将是(INDEX RANGE SCAN)。

第十四 使用基于函数的索引

前面谈到任何对列的操作都可能导致全表扫描,例如:

select * from emp where substr(ename,1,2)=’SM’;

但是这种查询在客服系统又经常使用,我们可以创建一个带有substr函数的基于函数的索引,

create index emp_ename_substr on eemp ( substr(ename,1,2) );

这样在执行上面的查询语句时,这个基于函数的索引将排上用场,执行计划将是(INDEX RANGE SCAN)。

相关日志

分类: Oracle 标签: , , , , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
Easy AdSense by Unreal