我面临一个问题,我必须从表('CHILD')中选择应该具有指向另一个表('PARENT')的外键的行。问题是外键坏了(长话短说,表是分区的,由于某种原因有孤儿),我必须在恢复外键之前清理子表。我想做的是(大致):
SELECT child.ID
from CHILD child
WHERE child.PARENT_ID NOT IN
(
SELECT parent.ID FROM PARENT parent
);
这似乎是正确的(从结果来看),但是效率很低:有 1M 个结果,子表包含 100M+ 行。由于我必须删除来自该查询结果的每一行,因此我正在使用分页,但这意味着每次都重复 NOT IN 查询。出于这个原因,我想知道是否有任何方法可以提高查询的性能。我已经尝试加入表格,但我意识到它不会起作用,因为我应该加入child.PARENT_ID = parent.ID
,所以不会有结果。所以问题是:有没有办法重写 NOT IN 查询以提高性能?