【发布时间】:2014-01-22 21:22:53
【问题描述】:
我尝试删除邮件列中具有空值的行,当且仅当存在具有相同 person_id 的非空值的行。
DELETE
FROM
EMP_MAIL EM
WHERE
MAIL IS NULL
AND EXISTS
(
SELECT
EMP_ID
FROM
EMP_MAIL EM2
WHERE
MAIL IS NOT NULL
AND EM.EMP_ID = EM2.EMP_ID
) ;
但这需要相当长的时间。 (我在 EMP_MAIL(EMP_ID) 上有一个非唯一索引)
有没有更好的方法来执行这个操作?
【问题讨论】:
-
定义“相当一段时间”。表中有多少行?你要删除多少行?表有多大(以 MB/GB/ 等为单位)?查询计划是什么?
-
表中有 3M 行。 0 行要删除。 30 秒。 2 全表访问。
-
查询很好。 3M 行 30 秒还不错。但是 EMP_ID 在表中重复 .. 为什么不将
EMP_ID设为 PK,如果MAIL列必须存储多个值,它们有一个名为 MAIL 的单独表,其中包含 emp_id、mail 列,然后您可以根据需要加入它们。跨度> -
你能解释一下你的逻辑规则吗?
-
@Hamidreza - 你是什么意思?我确实为员工设置了不同的表,但出于设计原因,我为每个员工保留一行,如果没有邮件,则输入一个空值。
标签: sql performance oracle