【发布时间】:2020-05-01 18:04:23
【问题描述】:
我收到了以下查询,当满足条件时,从表 et_fact_reclam_ter_his_misc 中删除返回的记录:
DELETE FROM et_fact_reclam_ter_his_misc
WHERE num_siniest || num_exped IN
(SELECT DISTINCT num_siniest || num_exped
FROM et_fact_reclam_ter_his_misc t1
WHERE NOT EXISTS (SELECT *
FROM et_fact_reclam_ter_misc t2
WHERE t1.num_siniest = t2.num_siniest));
我一直在搜索,发现使用EXISTS而不是IN会提高查询性能。但是我遇到了2个错误。第一个是当我将IN 运算符替换为EXISTS 时出现的错误消息:
DELETE FROM et_fact_reclam_ter_his_misc
WHERE num_siniest || num_exped EXISTS
(SELECT DISTINCT num_siniest || num_exped
FROM et_fact_reclam_ter_his_misc t1
WHERE NOT EXISTS (SELECT *
FROM et_fact_reclam_ter_misc t2
WHERE t1.num_siniest = t2.num_siniest));
ORA-00920: invalid relational operator
第二个是当我尝试在DELETE 内嵌套一个SELECT,但返回的行数不同:
DELETE FROM et_fact_reclam_ter_his_misc
WHERE EXISTS
(SELECT FROM et_fact_reclam_ter_his_misc
WHERE num_siniest || num_exped IN
(SELECT DISTINCT num_siniest || num_exped
FROM et_fact_reclam_ter_his_misc t1
WHERE NOT EXISTS
(SELECT *
FROM et_fact_reclam_ter_misc t2
WHERE t1.num_siniest = t2.num_siniest)));
感谢任何有助于提高查询性能的帮助
【问题讨论】:
-
如果您可以随约束/索引一起描述表格,则可以即兴创作。还需要每个表中的记录数和被删除的记录数
-
您可以尝试每个查询和反馈。
-
我一直在搜索,发现使用 EXISTS 代替 IN 可以提高查询性能。 你从哪里读到的?不会的。