改进查询oracle

时间:2015-07-28 10:06:51

标签: oracle10g

如何修改此查询以改进它? 我认为加入它会更好。

UPDATE  t1 HIJA
SET IND_ESTADO = 'P'
WHERE IND_ESTADO = 'D'
AND NOT EXISTS
(SELECT COD_OPERACION
FROM t1 PADRE
WHERE PADRE.COD_SISTEMA_ORIGEN = HIJA.COD_SISTEMA_ORIGEN
AND PADRE.COD_OPERACION = HIJA.COD_OPERACION_DEPENDIENTE)

最好的问候。

2 个答案:

答案 0 :(得分:0)

根据this articleQuassnoi

  

只要列表值声明为NOT EXISTS,Oracle的优化程序就能看到NOT INLEFT JOIN / IS NULLNOT NULL在语义上是等效的。< / p>      

它对所有三种方法使用相同的执行计划,并且它们同时产生相同的结果。

     

在Oracle中,可以安全地使用上述三种方法中的任何方法从另一个表中缺少的表中选择值。

     

但是,如果值不能保证NOT NULL,则应使用LEFT JOIN / IS NULLNOT EXISTS而不是NOT IN,因为后者会产生不同的结果,具体取决于是否在子查询结果集中有NULL个值。

所以你拥有的已经很好了。 JOIN一样好,但更好

答案 1 :(得分:0)

如果性能有问题,有几条准则可以将不存在的地方重写为更有效的形式:

  • 当给出不存在与不存在之间的选择时,大多数DBA更喜欢使用not exists子句。
  • 当SQL包含not in子句时,通常使用子查询,而不存在时,使用相关子查询。
  • 在许多情况下,NOT IN将生成与NOT EXISTS查询或不相等查询(!=)相同的执行计划。
  • 在某些情况下,可以使用带有NOT NULL测试的标准外连接重写相关的NOT EXISTS子查询。
  • 可以使用MINUS运算符调整一些NOT EXISTS子查询。

有关详细信息,请参阅Burleson