不存在的SQL查询速度不是很慢

不存在的SQL查询速度不是很慢,sql,oracle,Sql,Oracle,我正在使用以下查询将person从视图迁移到数据库,速度太慢: 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

我正在使用以下查询将person从视图迁移到数据库,速度太慢:

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)
连接字段上有索引,但我必须更改此查询,因为它将持续15分钟。。桌子相当大

所以。我有
PERSON\u视图
-我从中读取要迁移的人,
PERSON\u MIGR\u数据
-迁移的人的id,
PERSON\u MIGR\u错误
-迁移过程中未通过验证的人的记录id


我认为,不存在是瓶颈。但是怎样才能使这个查询更快呢?

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


您是否尝试过将到person\u migr\u数据的链接设为左联接,然后检查各个字段为空的字段,如PMD.RECORD\u ID=PERV.RECORD\u ID上的
左联接person\u migr\u数据PMD,然后将
where PMD.RECORD\u ID为空
置于何处?用同样的原则,另一个不存在“不同的”-哦,我的,哦,我的。。。他是“瓶颈”之一@Paul:当人们使用“Distinct”时,它通常表示人们不理解数据,他们在查询。数据是从视图中获取的-其中有一个select语句-从那里获取您需要的数据,您不必使用“Distinct”。@Ychdziu:Err。。。这是一个很大的假设,表明你相信OP不知道他自己的数据。这里的问题是,我们不知道他的数据…@Ychdziu未能从OP获得更多详细信息,我们不知道这是否是一个视图,或者OP在检索数据时可能存在的其他限制。可能原始数据的重复数据消除和标准化程度很差。在本例中,distinct关键字本身可能是必需的。直接假设OP不称职有点不友好。谢谢!快一点!!
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