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。
注:边学习边补充。
一、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。
注:边学习边补充。
编辑回复