максимальный лимит пунктов, которые может обрабатывать предложение In - PullRequest
1 голос
/ 30 мая 2019

Каковы пределы данных, которые я могу передать в базу данных на языке программирования (например, php).Предположим, у меня есть 1 миллион записей в моей базе данных, и у меня есть 1 миллион данных в моей руке, и я хочу провести проверку существующих.если бы я использовал запрос типа

 select id from table where id in (array of 1 million data)

, что произойдет?будет ли этот запрос достигать базы данных?если он достигнет, каковы возможности, он вернет данные с лучшей скоростью, чем миллион запросов к идентификаторам поиска в БД или вызову с полным выбором данных с миллионами циклов for.

просто для любопытства!.

1 Ответ

3 голосов
/ 30 мая 2019

Не существует конкретного числа, однако, в документации указано, что у вас, скорее всего, будут проблемы, если у вас есть «тысячи» значений. IN (Transact-SQL) - Примечания :

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

Ошибка 8623:

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

Ошибка 8632:

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

Чтобы процитировать мой комментарий, я сделал:

Если вам нужно передать большое количествозначения для запроса, я предлагаю параметр типа таблицы.Но если вам действительно нужно передать значения 1M +, значит, что-то не так с вашим дизайном.Возможно, вам даже лучше перечислить значения, которые вам не нужны.

Редактировать: чтобы добавить к моему комментарию, многие (включая меня) предпочитают использовать EXISTS вместо IN.Таким образом, вместо запроса типа:

FROM YourTable YT
WHERE YT.YourColumn IN (SELECT OT.YourColumn
                        FROM OtherTable OT)

Вы бы запросили:

FROM YourTable YT
WHERE EXISTS (SELECT 1
              FROM OtherTable OT
              WHERE OT.YourColumn = YT.YourColumn)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...