带有 NOT EXISTS 的 SQL 查询非常慢

mic*_*tmi 2 sql oracle

我正在使用以下查询将人员从视图迁移到我的数据库,这太慢了:

SELECT DISTINCT PI.VALUE ID
FROM PERSON_VIEW PERV
    inner join PERSON_IDENT PI on PI.VALUE = PERV.IDENTITY
    inner join PERSON PER on PER.ID = PI.EXTERNAL_ID
WHERE NOT EXISTS (SELECT RECORD_ID FROM PERSON_MIGR_DATA PMD
                  WHERE RECORD_ID = PERV.RECORD_ID)
  AND NOT EXISTS (SELECT RECORD_ID FROM PERSON_MIGR_ERRORS
                  WHERE RECORD_ID = PERV.RECORD_ID)
Run Code Online (Sandbox Code Playgroud)

连接字段上有索引,但我必须更改此查询,因为它持续 15 分钟。表非常大。

所以。我有PERSON_VIEW-我从中读取了要迁移PERSON_MIGR_DATA的人员,PERSON_MIGR_ERRORS-迁移人员的ID ,以及- 在迁移过程中未通过验证的人员的记录 ID。

我认为, NOT EXIST 是瓶颈。但是如何进行此查询以使其更快?

sca*_*dge 5

您可以尝试使用一对左连接进行不匹配(而不是不存在)

SELECT DISTINCT PI.VALUE ID
FROM PERSON_VIEW PERV
inner join PERSON_IDENT PI on PI.VALUE = PERV.IDENTITY
inner join PERSON PER on PER.ID = PI.EXTERNAL_ID
LEFT JOIN PERSON_MIGR_DATA PMD ON  PMD.RECORD_ID = PERV.RECORD_ID
LEFT JOIN PERSON_MIGR_ERRORS PME ON  PME.RECORD_ID = PERV.RECORD_ID
where PMD.RECORD_ID is null and PME.RECORD_ID is null 
Run Code Online (Sandbox Code Playgroud)