Кто-нибудь знает, каков предел количества значений, которые можно получить в списке выражений (чтобы проверить соответствие) для предложения IN?
Ограничение предложения "IN" на сервере Sql
Ответ 1
Да, есть предел, но MSDN указывает только, что он находится в тысячах:
Включение чрезвычайно большого количества значений (много тысяч) в предложение IN может потреблять ресурсы и возвращать ошибки 8623 или 8632. Чтобы обойти эту проблему, сохраните элементы в списке IN в таблице.
Внимательно изучив эти ошибки, мы видим, что это ограничение не относится к IN
, но относится к сложности запроса в целом:
Ошибка 8623:
Обработчик запросов исчерпал внутренние ресурсы и не смог создать план запроса. Это редкое событие и ожидается только для чрезвычайно сложных запросов или запросов, которые ссылаются на очень большое количество таблиц или разделов. Пожалуйста, упростите запрос. Если вы считаете, что получили это сообщение по ошибке, обратитесь в Службу поддержки клиентов за дополнительной информацией.
Ошибка 8632:
Внутренняя ошибка: достигнут лимит служб выражений. Пожалуйста, найдите потенциально сложные выражения в своем запросе и попробуйте упростить их.
Ответ 2
Это не является специфическим, а связано с генератором плана запроса, превышающим пределы памяти. Я могу подтвердить, что с несколькими тысячами он часто принимает ошибки, но может быть разрешен путем вставки значений в таблицу сначала и перефразировать запрос как
select * from b where z in (select z from c)
где значения, которые вы хотите в разделе in, приведены в таблице c. Мы использовали это успешно с пунктом в 1 миллион.
Ответ 3
В зависимости от используемого вами механизма базы данных могут быть ограничения на длину инструкции.
SQL Server имеет очень большой предел:
Максимальная емкость для SQL Server
Итак, для больших предложений IN лучше создать временную таблицу, вставить значения и сделать JOIN. Он работает быстрее.
Существует предел, но вы можете разделить свои значения на отдельные блоки in()
Select *
From table
Where Col IN (123,123,222,....)
or Col IN (456,878,888,....)
используйте параметр таблицы, оцененный в 2008 году, или какой-либо описанный здесь подход
Ответ 4
В зависимости от того, как вы выполняете запрос (JDBC, Hiberante, какой-то SQL-GUI) и при использовании литеральных значений вместо подзапроса where X in (1, 2, 3...)
вы также можете столкнуться со следующей ошибкой:
В этом запросе RPC было предоставлено слишком много параметров. Максимум 2100.
Таким образом, в этих случаях предел будет 2100 (или даже меньше, если присутствуют другие параметры).