更新数据时我应该使用 NOT IN 或 NOT EXISTS

问题描述 投票:0回答:2
UPDATE PERSON
SET ENROLMENT_DATE = CURRENT_TIMESTAMP
WHERE NOT EXISTS (SELECT * FROM FEE_PAYMENT WHERE FEE_PAYMENT.PERSON_ID = PERSON.PERSON_ID);

UPDATE PERSON
SET ENROLMENT_DATE = CURRENT_TIMESTAMP
WHERE PERSON_ID NOT IN (SELECT  FEE_PAYMENT.PERSON_ID FROM FEE_PAYMENT);

哪一个更好,为什么? 我喜欢这种情况下的 NOT IN,因为它读起来更容易,但我知道如果我偶然发现一个空值,我可能会遇到问题。

sql oracle subquery correlated-subquery
2个回答
0
投票

我想你最好的选择是实际比较代码的两个版本,检查解释计划所说的内容,然后决定使用哪一个。

但请注意,在小数据集上,您不会注意到任何差异。

另一种选择也可能是合并,例如

merge into person a
  using fee_payment b
  on (a.person_id = b.person_id)
when matched then update set
  a.enrollment_date = current_timestamp;

此外,乍一看,两个

person_id
列上的索引可能会提高性能。


0
投票

对于较小的数据集

Not In
Not Exists
没有太大明显的差异,但对于较大的数据集
Not Exists
表现良好。

在编写查询时,您可以假设

NOT EXISTS
将提供更好的结果,因为它可以使用所有逻辑和优化来连接两个表,而
NOT IN
运算符将导致使用子计划。 SubPlan就像Oracle中的过滤操作,当我们处理大数据集时,它会产生瓶颈。
NOT EXISTS
子句反过来将导致没有任何子计划的反连接。

来源-1:https://www.postgresdba.com/bbs/board.php?bo_table=C05&wr_id=207

来源2:https://www.postgresql.org/message-id/013d01c3ca89$7307d7d0$7201a8c0@mst1x5r347kymb

© www.soinside.com 2019 - 2024. All rights reserved.