Oracle - плохая производительность при использовании Left Join ON, где NULL - PullRequest
0 голосов
/ 02 ноября 2018

как мой заголовок. У меня есть следующий код:

SELECT * FROM
(SELECT "Student_ID", "ID_Card", "First_Name", "Last_Name" FROM "STUDENT@DBLA
 WHERE "YEAR" = 2018 AND "SEX" = 'FEMALE') T
LEFT JOIN (SELECT Student_ID, ID_Card, First_Name, Last_Name FROM schema.STUDENTS
           WHERE YEAR = 2018 AND SEX = 'FEMALE') D
ON D.ID_Card = T."ID_Card" WHERE D.ID IS NULL;

Этот запрос выполняется очень низко, возможно, остановлюсь, когда я добавлю предложение Где пустое предложение. Любое решение для этой проблемы? Большое спасибо!

1 Ответ

0 голосов
/ 02 ноября 2018

Мы можем попытаться написать ваш запрос как прямое левое соединение, не прибегая к подзапросам:

SELECT
    t1.Student_ID,
    t1.ID_Card,
    t1.First_Name,
    t1.Last_Name,
    t2.Student_ID AS Student_ID_2
    t2.ID_Card AS ID_Card_2,
    t2.First_Name AS First_Name_2,
    t2.Last_Name AS Last_Name_2
FROM "STUDENT@DBLA" t1
LEFT JOIN schema.STUDENTS t2
    ON t1.ID_Card = t2.IDCard AND
       t2.YEAR = 2018 AND t2.SEX = 'FEMALE' AND t2.ID IS NULL
WHERE
    t1.YEAR = 2018 AND t1.SEX = 'FEMALE';

Причина, по которой вы можете избежать использования подзапросов, заключается в том, что это может заставить Oracle материализовать промежуточный результат в вашем общем запросе. Это может быть дорогостоящим с точки зрения производительности по многим причинам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...