Использование IN для более чем одного или двух значений может быть очень дорогим для ресурсов. Как сказал Зайнул, объединение гораздо эффективнее.
Следующим шагом по скорости является использование функции WHERE EXISTS
. Преимущества хорошо задокументированы, если у вас есть быстрый Google, вы найдете много примеров и причин, почему это быстрее. Я не буду повторять все остальные комментарии здесь.
В качестве примера рассмотрим следующий быстрый код:
DECLARE @SourceTable AS TABLE (ID INT NOT NULL, SomeText NVARCHAR(255));
DECLARE @AllowedTable AS TABLE (ID INT NOT NULL);
INSERT INTO @SourceTable
VALUES (1, 'Apples')
, (2, 'Oranges')
, (3, 'Bananas')
, (4, 'Pears');
INSERT INTO @AllowedTable (ID)
VALUES (1)
, (3);
SELECT S.ID
, S.SomeText
FROM @SourceTable S
WHERE EXISTS (SELECT 1 FROM @AllowedTable A WHERE A.ID = S.ID);
Где существует ищет присутствие записи, а не содержание записи, поэтому ограничивает чтение, и вы также не столкнетесь с проблемами дублирующих строк, которые могут «появиться из ниоткуда», когда данные не вполне то, что вы ожидаете.