微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle之SQL语句优化第二篇

1、索引对不等号和NOT的限制
如果WHERE条件中出现!=或者<>,即使该列建立了索引,则该索引也不会被使用;如果不恰当的使用了NOT,则索引也不会被使用。
例子:select * from table t where id<> 123,这种写法不会使用索引,耗时多
select * from table t where id>123 or id<123 这种写法会调用索引,耗时少
select * from table t where not (id=123) 这种写法最优,耗时最少
结论:如果索引列是数字,则对于不等号的处理可以变更为NOT的方式或者(大于 OR 小于)的方式,但是如果索引是字符,对于NOT的写法也不会调用索引。
2、索引对IS NULL的限制
一般来说,如果WHERE子句基于的列是可空的列,且其建立了索引,如果使用了IS NULL,由于NULL的列本身不包含在索引中,因此无法利用索引。
所以一般对要建立索引的列不要设置为可空,如果确实含有空值,建议使用认值代替空值,具体参见前面章节“sql优化技巧”部分的“使用认值”。

3、索引对函数的限制
对该列在WHERE子句中使用了函数,则不能使用索引。因此,对在WHERE子句中经常要使用函数时,应该建立基于函数的索引,且只有当查询语句包含该函数或者表达式时,基于函数的索引才会被调。详情请参见索引部分的理论讲解!

4、索引对不匹配数据类型的限制
因此在对其指定的值是数字时,Oracle虽然能隐式的执行数字和字符的转换,但不会调用其索引。而当对其指定是字符时,则不存在此问题,索引可以调用
注意:因为数据类型的不匹配和Oracle对数据类型的隐式转换,此种类型的低效代码在任何项目中均可能因为大意而存在,因此建议开发人员和管理人员要定期抽查相应的代码,以杜绝此类低效代码

原文地址:https://www.jb51.cc/oracle/208808.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐