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

优化Oracle的SQL语句(三)

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

第四 尽量去掉”IN”、”OR”

含有”IN”、”OR”的Where子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。  

例4: select count(*) from stuff where id_no in(‘0′,’1′)(23秒)

可以考虑将in子句分开:  

select count(*) from stuff where id_no=’0′ 
select count(*) from stuff where id_no=’1′

然后再做一个简单的加法,与原来的SQL语句相比,查询速度更快。

第五 尽量去掉 “<>”

尽量去掉 “<>”,避免全表扫描,如果数据是枚举值,且取值范围固定,则修改为”OR”方式。

例5:

 UPDATE SERVICEINFO SET STATE=0 WHERE STATE<>0;

以上语句由于其中包含了”<>”,执行计划中用了全表扫描(TABLE ACCESS FULL),没有用到state字段上的索引。实际应用中,由于业务逻辑的限制,字段state为枚举值,只能等于0,1或2,而且,值等于1,2的很少,因此可以去掉”<>”,利用索引来提高效率。

修改为:UPDATE SERVICEINFO SET STATE=0  WHERE STATE = 1 OR STATE = 2 。进一步的修改可以参考第4种方法。

第六 去掉Where子句中的IS NULL和IS NOT NULL

Where字句中的IS NULL和IS NOT NULL将不会使用索引而是进行全表搜索,因此需要通过改变查询方式,分情况讨论等方法,去掉Where子句中的IS NULL和IS NOT NULL。

相关日志

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