Производительность SQL-запросов Oracle w / NOT IN - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь получить список всех номеров клиентов из одной из наших баз данных. Мне нужны только клиенты, у которых нет пациентов и нет истории счетов.

Мой запрос работает (возвращает правильные результаты) ... но для его выполнения требуется ~ 16 часов. Я подозреваю, что это можно сделать гораздо эффективнее, но мне нужны некоторые указатели, чтобы начать в правильном направлении.

SELECT A.account_number FROM ClientTable A
WHERE A.account_number NOT IN (SELECT B.account_number FROM PatientTable B) AND
        A.account_number NOT IN (SELECT C.account_number FROM BillingTable C);

ClientTable имеет ~ 10 миллионов строк

Таблица пациента имеет ~ 12 миллионов строк

BillingTable имеет ~ 25 миллионов строк

Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

NOT IN часто дорогой. Иногда может работать ЛЕВОЕ СОЕДИНЕНИЕ и условие фильтра, но это зависит от вашей ситуации, поэтому с точки зрения производительности я хотел бы проявить осторожность и проверить ваш План объяснения, особенно со многими строками и таблицами.

SELECT A.account_number 
FROM   ClientTable A
LEFT OUTER JOIN PatientTable B ON A.account_number = B.account_Number
LEFT OUTER JOIN BillingTable C ON A.account_number = C.account_Number
WHERE B.account_number IS NULL AND C.account_number IS NULL;
0 голосов
/ 08 мая 2018

Наборы принесут пользу и улучшение?

(select account_number from clientTable
 minus
 select account_number from patientTable
)
 union    --> optionally, UNION ALL
(select account_number from clientTable
 minus
 select account_number from billingTable
);

UNION ALL вместо UNION должно быть быстрее, поскольку не нужно было бы удалять дубликаты.

...