SQL – не существует запроса с миллионами записей

Я пытаюсь использовать следующий SQL-запрос (в SAS), чтобы найти записи из pool1 , которых нет в pool2 . Pool1 имеет 11 000 000 записей, pool2 имеет 700 000. Здесь я столкнулся с проблемой. Я разрешил запрос работать в течение 16 часов, и он почти не заканчивался. Есть ли более эффективный способ (в SQL или SAS) для достижения того, что мне нужно делать?

 PROC SQL; CREATE TABLE ALL AS SELECT A.ID FROM POOL1 A WHERE NOT EXISTS (SELECT B.ID FROM POOL2 B WHERE B.ID = A.ID); QUIT; 

     PROC SQL; CREATE TABLE ALL AS SELECT A.ID FROM POOL1 A WHERE A.ID NOT IN (SELECT B.ID FROM POOL2 B) ; 

    Вышеуказанное изменение должно возвращать один и тот же набор результатов, но занять значительно меньше времени, поскольку вы не пытаетесь присоединиться к POOL2 обратно к POOL1, но просто исключая результаты, которые существуют в POOL2.

    Как указано в другом ответе, индекс может помочь, но если поля идентификатора являются первичными ключами, вероятно, они уже подлежат индексу.

    Ваш запрос в порядке. В большинстве баз данных not exists наилучшего способа (или одного из лучших способов) выразить эту логику.

    Однако вам нужен индекс производительности:

     create index idx_pool2_id on pool2(id); 

    Вы делаете это в SAS, так почему бы не использовать шаг данных?

     data all; merge pool1(in = a) pool2(in = b keep = ID); by ID; if a and not(b); run; 

    Это требует, чтобы оба набора данных были либо отсортированы, либо индексированы по идентификатору. Если у вас несколько записей на ID в B, я бы предложил сначала дедуплицировать через

     proc sort data = pool2 out = temp nodupkey; by id; run; 
     PROC SQL; CREATE TABLE ALL AS SELECT A.ID FROM POOL1 A LEFT JOIN POOL2 B ON B.ID = A.ID WHERE B.ID IS NULL