SQL查询的最大长度

时间:2011-02-08 18:18:03

标签: sql ruby postgresql activerecord

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 个答案:

答案 0 :(得分:15)

PostgreSQL可以处理的查询的最大长度是2147483648个字符(带符号的4字节整数;请参阅src/include/lib/stringinfo.h)。

答案 1 :(得分:4)

为了避免查询大小,你可以用IN替换IN(1,2)(从follower_id =?中选择follow_id)或者从跟随者的id中找到被跟踪用户的ID的任何相应查询。

答案 2 :(得分:1)

您可以考虑使用子查询来构造原始WHERE子句的IN部分。所以结果看起来像这样:

“SELECT f。* FROM feeds f,user_feeds uf WHERE(f.id = uf.feed_id和uf.user_id in(SELECT跟随whereer = id))ORDER BY created_at DESC”

显然子查询不正确,因为我发布了它,但这应该给你一般的想法。

答案 3 :(得分:1)

虽然查询字符串的长度没有(实际)限制,但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“。

答案 4 :(得分:0)

使用相关的子查询。如果您有一个用于保存用户的表,则跟随您的查询文本将不会增长。

例如:

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;