Лучший способ отфильтровать огромную таблицу по другой огромной таблице в DB2 / SQL? - PullRequest
0 голосов
/ 27 декабря 2018

У меня проблема с большим запросом, который я сделал.

Проще говоря, [TABLE A] содержит около 6 миллионов идентификаторов, а [TABLE B] - около 4 миллионов идентификаторов.Мне нужно добавить в [ТАБЛИЦА B] идентификаторы из [ТАБЛИЦЫ A], которых еще нет в [ТАБЛИЦЕ B] (многие повторяются в обеих таблицах, поскольку у них есть другие столбцы с разными значениями).[Таблица A] и [Таблица B] оба являются CTE.

Я перепробовал все, от ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ, где A.ID - ноль, до NOT IN и до ГДЕ НЕ СУЩЕСТВУЕТ,но все они бегут целую вечность:

SELECT
ID
OTHER COLUMNS
FROM A LEFT OUTER JOIN B ON A.ID = B.ID
WHERE B.ID IS NULL

SELECT
ID
OTHER COLUMNS
FROM A
WHERE A.ID NOT IN (SELECT ID FROM B)

Есть ли какой-нибудь другой способ, который вы могли бы придумать, который может достичь этого результата более быстрым или более эффективным способом?

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

В соответствии с вашим комментарием «Спасибо за ваш ответ. Что вы имеете в виду под индексом в столбце идентификатора?», Вам необходимо убедиться, что таблицы ботов имеют индекс по идентификатору.Предполагая, что в обоих случаях идентификатор является уникальным и первичным ключом, вы должны выполнить:

ALTER TABLE A ADD PRIMARY KEY (ID)
ALTER TABLE B ADD PRIMARY KEY (ID)

И после этого он должен работать нормально, я бы порекомендовал вам предложение NOT EXISTS, как показано ниже:

SELECT
ID
OTHER COLUMNS
FROM A
WHERE NOT EXISTS (SELECT ID FROM B WHERE A.ID = B.ID)

Если он все еще медленный, сгруппируйте его в меньшие наборы, как показано ниже:

WHILE 1 = 1
BEGIN
BEGIN TRANSACTION;
SELECT TOP 100000 
ID
OTHER COLUMNS
FROM A
WHERE NOT EXISTS (SELECT ID FROM B WHERE A.ID = B.ID);
IF @@ROWCOUNT = 0 
BEGIN
     COMMIT
     BREAK
END
COMMIT;
END;

Это будет выполнять отдельные транзакции для числа строк, выбранных вами в строке «SELECT TOP 100000».

0 голосов
/ 27 декабря 2018

Чтобы выбрать записи из не в б.Обычно объединение исключений выполняется немного быстрее, чем предложение not in, поскольку процессор sql будет полностью использовать индексы.

select blah from table a exception join table b on a.id = b.id
0 голосов
/ 27 декабря 2018

Вы пытались использовать GROUP BY для своих столбцов?В T-SQL GROUP BY выполняет запросы к таблицам CTE примерно в 30 раз быстрее и наравне с временными таблицами.Вы также можете изучить функцию EXCEPT, чтобы найти строки, которые нужно добавить

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