SQL 语名优化(针对ORACLE)

回复 收藏
ORACLE  SQL语句调优之写书

一、is null 与 is not null
        语句中where条件时,该列不能使用。ORACLE 不允许此项使用索引。
          例:select empno,ename,deptno from emp where sal is null;
        此语句中sal列,即使有索引,此句SQL也不会使用索引。

二、带通配符(%)的like语句
         例:select * from employee where last_name like "%Cliton%";
        通配符%在搜语首出现,ORACLE不会使用last_name的索引。当通配符出现在字符串其他位置时,优化器就能使用索引。
        如:last_name like "C%";

三、不等于运算符(<>、!=)
        ORACLE每当在where子句中使用不等于运算符时,都不会使用索引。
          例:…… where salary <> 3000;
        此句中salary列就不会使用索引,可改为:where salary < 3000 or salary > 3000;不能使用not、not 也等于<>、!=;

四、函数使用
        where子句中使用函数时,ORACLE不会使用索引。
         例:…… where trunc(hiredate) = '01-MAY-01';
        可以使用上一个例子的方法修改,使其使用索引;

五、in 与 exists
        尽量使用exists来代替in,包括用not exists来代替not in。因为两者在执行顺序上的差异而导致效率不一样。
         例:select * from a where a.id in ( select b.id from b );
           修改为:select * from a where a.id exists ( select b.id from b );
        上面一句会先执行 select * from a 再执行 select b.id from b ,而exists却相反,所以就导致了效率低下。
       
六、order by 语句
        仔细检查order by 语句找出非索引项式表达式,可以为其所使用的列建立另一个索引,避免在order by子句中使用表达式;

七、联接列
        即使最后的联接值为一个静太值,也不会使用索引。
         例:select * from employs where first_name || '' || lase_name = 'Beill cliton';
        由于优化器对基于last_name创建的索引没有使用,可以修改为:…… where first_name = 'Beill' and last_name 'Cliton';


针对我们公司的SAP系统IO瓶颈,发现SQL语句中使用了大量 不等于运算符(<>、!=), 建议修改此类SQL。
注:边学习边补充。
2011-10-27 10:23 举报
已邀请:

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: