Oracle10g 改进查询oracle
如何修改此查询以改进它? 我认为加入会更好Oracle10g 改进查询oracle,oracle10g,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) 致
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)
致以最诚挚的问候。根据:
Oracle的优化器能够看到不存在
,不在
和左连接/为空
在语义上是等价的,只要列表值声明为非空
它对所有三种方法使用相同的执行计划,并且它们在同一时间产生相同的结果
在Oracle中,可以使用上述三种方法中的任何一种从另一个表中缺少的表中选择值
但是,如果不能保证值不为NULL
,则应使用左连接/为NULL
或不存在
,而不是不在
中,因为后者将根据子查询结果集中是否存在NULL
值而产生不同的结果
所以你所拥有的已经很好了。如果性能有问题,有几个准则可以将不存在的连接重新编写为更有效的形式:
- 在not exists和not in之间进行选择时,大多数DBA更喜欢使用not exists子句李>
- 当SQL包含not in子句时,通常使用子查询,而对于not exists,则使用相关子查询李>
- 在许多情况下,NOT In将生成与NOT EXISTS查询或NOT EQUERY查询相同的执行计划(!=)
- 在某些情况下,可以使用带有NOTNULL测试的标准外部联接重新编写相关NOT EXISTS子查询
- 一些不存在的子查询可以使用减号运算符进行优化
有关更多信息,请参阅。从哪些方面改进??表演