Ограничение на количество элементов в списке для SQL-запроса предложения WHERE - PullRequest
0 голосов
/ 15 марта 2019

Пожалуйста, каково количество элементов, которые могут быть в списке для запроса SQL с использованием списка для условия WHERE

SELECT field1, field2, field3 from Table WHERE id IN ('val1', 'val2', 'val3', ... 'valN')

Какой предел N?

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Явное включение чрезвычайно большого количества значений (многие тысячи значений, разделенных запятыми) в скобках в предложении IN может потреблять ресурсы и возвращать ошибки 8623 или 8632. Чтобы обойти эту проблему, сохраните элементы в IN список в таблице и использовать подзапрос SELECT в предложении IN.

Ошибка 8623:

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

Ошибка 8632:

Внутренняя ошибка: достигнут лимит служб экспрессии. пожалуйста ищите потенциально сложные выражения в вашем запросе и пытайтесь упростить их.

документы Microsoft

1 голос
/ 15 марта 2019

Использование 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);

Где существует ищет присутствие записи, а не содержание записи, поэтому ограничивает чтение, и вы также не столкнетесь с проблемами дублирующих строк, которые могут «появиться из ниоткуда», когда данные не вполне то, что вы ожидаете.

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