具有“where exists”的“Set”在没有的情况下表现更好

时间:2016-10-13 14:27:45

标签: sql oracle etl exists

我偶然发现了这个奇怪的案例。

环境:

  • Oracle 12.2.2
  • 参与2个表格。
  • ñ。行16 milions

据我所知,并在此处Oracle / PLSQL: EXISTS Condition报告where exists的使用通常不如其他方式。

在我的情况下,当使用另一个连接条件更新一个表的列与存在时,查询运行大约12-13秒没有问题(我只做了一些检查,因为我真的不知道所有的表的内容):

update fdm_auftrag ou
set (ou.e_hr,ou.e_budget) =  ( select b.e_hr,b.e_budget
                 from  fdm_budget_auftrag b 
                where b.fk_column1 = ou.fk_column1
                 and b.fk_column2 = ou.fk_column2
                 and  b.fk_col3 = ou.fk_col3 )
where exists ( select b.e_hr,b.e_budget
                 from  fdm_budget_auftrag b 
                where b.fk_column1 = ou.fk_column1
                 and b.fk_column2 = ou.fk_column2
                 and  b.fk_col3 = ou.fk_col3  );

而不是存在,它需要花费很多时间,然后我甚至打断它。

我只是因为存在中的条件被评估为布尔值,如果工程师发现至少有一行,那么不得不对数据库进行较少的操作,但我不确定。

这个“猜测”是对的,有人有更明确的解释吗?

1 个答案:

答案 0 :(得分:1)

where子句限制了正在更新的行数。

更少的更新行意味着update查询运行得更快。更新行有很多开销,包括为了回滚目的而隐藏信息。

我假设您在更大的表中更新相对较少的行。如果where子句选择了大多数行,则可能没有性能差异。

最后,两个查询不完全相同。如果没有where不匹配的值,则会指定NULL