我偶然发现了这个奇怪的案例。
环境:
据我所知,并在此处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 );
而不是存在,它需要花费很多时间,然后我甚至打断它。
我只是因为存在中的条件被评估为布尔值,如果工程师发现至少有一行,那么不得不对数据库进行较少的操作,但我不确定。
这个“猜测”是对的,有人有更明确的解释吗?
答案 0 :(得分:1)
where
子句限制了正在更新的行数。
更少的更新行意味着update
查询运行得更快。更新行有很多开销,包括为了回滚目的而隐藏信息。
我假设您在更大的表中更新相对较少的行。如果where
子句选择了大多数行,则可能没有性能差异。
最后,两个查询不完全相同。如果没有where
不匹配的值,则会指定NULL
。