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,因为它读起来更容易,但我知道如果我偶然发现一个空值,我可能会遇到问题。
我想你最好的选择是实际比较代码的两个版本,检查解释计划所说的内容,然后决定使用哪一个。
但请注意,在小数据集上,您不会注意到任何差异。
另一种选择也可能是合并,例如
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
列上的索引可能会提高性能。
对于较小的数据集
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