SQL 查询的最大长度是多少?

18
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 ()”中的用户ID数量也会随之增加。
SQL查询语句的允许最大长度是多少?是否有更好的方法来实现上述查询?
注意:我正在使用ActiveRecord和Postgres。

我认为你需要解释一下什么是“feeds”、“user_feeds”,以及“他”是谁。还有其他值得关注的表吗?用户ID 1、2、5等等是否存储在一个表中? - ChrisJ
源料:id,feed_type 使用者動態:id,feed_id, user_id 使用者:id,username其中,feed_type可选项包括like(点赞)、comment(评论)等。在某人点赞某物(例如照片)时,“feeds”表会有一条记录,并在用户所包含的照片中向“user_feeds”表添加条目。是的,1、2、5等为使用者ID。 - Prakash Raman
5个回答

36

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


17
2147483648个字符等于2GiB。 - Quolonel Questions
@Peter Eisentraut:int32的最大值是2147483647,因为C-Strings有一个终止的0字节,所以它是intMaxValue(+1?)减一。无论如何,它都小于2147483648。此外,现在在stringinfo.c中定义了该值,其值为#define MaxAllocSize ((Size) 0x3fffffff) /* 1 gigabyte - 1 */,这意味着1GB减1。你怎么得出2GB的结论的?自2011年以来,这个值是否被更改过? - Stefan Steiger
@Quolonel 问题:还有一个至少一位的偏移错误。int32.MaxValue是2147483647,顺便提一下。 - Stefan Steiger

8

这不是“IN(x,y,z ...)子句的数量”,而是每个子句的长度 - turbo

5
为了避免查询大小的问题,您可以将 IN (1, 2) 替换为 IN (select followed_id from following where follower_id = ?) 或者其他适当的查询来查找关注者 id 的被关注用户的 id。

啊,这是一种更简便的写法。 - Prakash Raman

1
你可以考虑使用子查询来构建原始WHERE子句中IN部分。 因此,结果将如下所示:
"SELECT f.* FROM feeds f, user_feeds uf WHERE (f.id=uf.feed_id and uf.user_id in (SELECT followed where follower = id)) ORDER BY created_at DESC"
显然,我发布的子查询不正确,但这应该让你有个大致的想法。

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接