В mysql или postgres есть ли ограничение на размер оператора IN (1,2, n)? - PullRequest
7 голосов
/ 11 марта 2010

У меня довольно много SQL-операторов, таких как:

SELECT foo FROM things WHERE user_id IN (1,2,3..n)

Существует ли известное ограничение на количество элементов, которые будут безопасно помещаться в таком предложении IN?

Ответы [ 6 ]

7 голосов
/ 11 марта 2010

Лимит 1000 в PostgreSQL - это не жесткий предел, это предел оптимизации, т.е. после 1000 PostgreSQL не очень хорошо с этим справляется. Конечно, я должен спросить, что в мире вы делаете с предложением IN IN 1000.

4 голосов
/ 10 января 2012

Для MySQL, из руководства :

Количество значений в списке IN ограничено только значением max_allowed_packet.

4 голосов
/ 11 марта 2010

Технических ограничений нет, но есть некоторый предел «здравого смысла».

Наличие слишком большого количества элементов в предложении IN означает, что запрос, вероятно, имеет неправильный дизайн (imho)

2 голосов
/ 16 марта 2010

Я использовал его в динамических запросах, созданных для postgres с sqlalchemy, с параметрами более 25k. Кроме того, они передавались в функции Python через позиционные параметры (* args) .... но я не заметил замедления в моем случае. YMMV

0 голосов
/ 11 марта 2010

Я почти уверен, что у Postgres есть предел в 1000 ... хотя не могу найти ни одного документа, подтверждающего это.

0 голосов
/ 11 марта 2010

Нет, но будьте осторожны при использовании оператора IN. Если вы используете подзапрос в операторе IN, это может отрицательно повлиять на производительность, поскольку SQL Server должен сгенерировать весь набор результатов и по существу построить потенциально большой оператор IF внутри себя.

Например, что-то вроде Select * From MyTable where MyColumn IN (Select myColumn from AnotherTable) может быть несколько медленным, если подзапрос возвращает большое количество строк. Часто бывает эффективнее использовать EXISTS.

...