Oracle SQL优化2

Oracle SQL 的优化规
一:尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替 ,用IN写出来的SQL,的优点是比较容易写及清晰易懂,但是用IN的SQL
性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:
      ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用 IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL
就不能转换了。
      Oracle在执行IN子查询时,首先执行子查询,将查询结果放入临时表再执行主查询。而EXIST则是首先检查主查询,然后运行子查询直到找到第一个匹配项。NOT EXISTS比NOT IN效率稍高。但具体在选择IN或EXIST操作时,要根据主子表数据量大小来具体考虑。
        推荐方案:在业务密集的SQL当中尽量不采用IN操作符。不用NOT IN操作符,可以用NOT EXISTS或者外连接(+) 替代此操作          

 

 二: 推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替
不用“<>”或者“!=”操作符。对不等于操作符的处理会造成全表扫描,可以用“<” or “>”代替
        不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。
        推荐方案:用其它相同功能的操作运算代替,如:
        1)a<>0 改为 a>0 or a<0
        2)a<>’’“ 改为 a>“”

 

 

      比如:表A里面的一个字段叫做MOBILE 里面存的记录如下
       1
       2
       3
       4
      表B里面的一个字段也叫做MOBILE里面存的记录如下
      1
      2
      9
      10
 
    (1)我们要查询一下A和B里面都有的,以前我使用的是
    select A.mobile from  A where A.mobile in (select B.mobile from B)
    出来结果为:
    1
    2
   
    没关系,去除重复就得到结果3,4,9,10了
   现在我们使用另外一种SQL呢:
   select A.mobile from A,B where A.mobile=B.mobile
   结果为
  1
  2
  同样滤去除重复就得到结果3,4,9,10了
(2)第二个实验我们要取一下在A中有的,而在B中没有的,以前我都是使用not in 不要太熟练了,呵呵!不过从来也不考虑个效率。
  select  A.mobile from  A where A.mobile not in (select B.mobile from B)
  得出结果
  3
  4
 然后我们再使用连接在处理
  select A.mobile from A,B where A.mobile=B.mobile(+) and B.mobile is null
  这条语句还可以表示为:
  select A.mobile from A left outer  join B on (A.mobile=B.mobile) where B.mobile is null
  结果为:
  3
  4
  (3) 第三个实现我们要取B中有的,而A中没有的,直接用连接了
   select B.mobile from B left outer join A on (B.mobile=A.mobile) where A.mobile is null
  等价于
  select B.mobile from A,B where A.mobile(+)=B.mobile and A.mobile is null 
  等价于
  select B.mobile from A right outer join B on (A.mobile=b.mobile) where A.mobile is null
 
  结果为:
  10
  9

三:Where子句中出现IS NULL或者IS NOT NULL时,Oracle会停止使用索引而执行全表扫描。可以考虑在设计表时,对索引列设置为NOT NULL。这样就可以用其他操作来取代判断NULL的操作 ,IS NULL 或IS NOT NULL操作(判断字段是否为空)

你可能感兴趣的:(Oracle SQL优化2)