Максимальная длина SQL-запроса - PullRequest
9 голосов
/ 08 февраля 2011
SELECT f.* 
FROM feeds f, 
     user_feeds uf 
WHERE (f.id=uf.feed_id and uf.user_id in (1,2,5,6,23,45)) 
ORDER BY created_at DESC

Это запрос, используемый для построения каналов пользователя. Проблема, с которой я столкнулся в этом запросе, заключается в том, что «uf.user_id in ()» увеличивается с увеличением количества пользователей, за которыми он следует.

Какова максимально допустимая длина SQL-запроса? Есть ли лучший способ реализовать мой запрос выше?

Примечание: я использую ActiveRecord. И я использую Postgres.

Ответы [ 5 ]

15 голосов
/ 08 февраля 2011

Максимальная длина запроса, который может обрабатывать PostgreSQL, составляет 2147483648 символов (4-байтовое целое со знаком; см. src/include/lib/stringinfo.h).

4 голосов
/ 08 февраля 2011

Чтобы избежать размера запроса, вы можете заменить IN (1, 2) на IN (выберите follow_id из следующих, где follower_id =?) Или каким-либо другим подходящим запросом, чтобы найти идентификаторы отслеживаемых пользователей из идентификатора подписчика. ,

1 голос
/ 20 ноября 2012

Хотя не существует (реального) ограничения на длину строки запроса, существует ограничение на количество предложений IN (x, y, z ...): 10000, настраивается в файле postgres.ini:

См .: http://grokbase.com/t/postgresql/pgsql-general/061mc7pxg6/what-is-the-maximum-length-of-an-in-a-b-c-d-list-in-postgresql:

"В версии 7.4 и более ранних это зависит от настройки max_expr_depth."... "В 8.0 и более поздних версиях max_expr_depth больше нет, и предел зависит от max_stack_depth."

1 голос
/ 08 февраля 2011

Вы можете рассмотреть возможность использования подзапроса для создания части IN вашего исходного предложения WHERE.Таким образом, результат будет выглядеть примерно так:

"SELECT f. * FROM каналов f, user_feeds uf WHERE (f.id = uf.feed_id и uf.user_id в (SELECT следует, где follower = id)) ORDERBY create_at DESC "

Очевидно, что подзапрос не так, как я написал, но это должно дать вам общее представление.

0 голосов
/ 10 февраля 2011

Использовать коррелированный подзапрос.Если у вас есть таблица, содержащая пользователей, за которыми следует участник, ваш текст запроса не будет расти.

Например:

SELECT f.* 
FROM feeds f, 
     user_feeds uf 
WHERE f.id=uf.feed_id 
  AND EXISTS (SELECT 'X'
              FROM follows
              WHERE follows.user_id = uf.user_id) 
ORDER BY created_at DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...