2011-02-08 10 views
7
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 쿼리의 최대 길이

SQL 쿼리에 허용되는 최대 길이는 얼마입니까? 위 쿼리를 구현하는 더 좋은 방법이 있습니까?

참고 : ActiveRecord를 사용하고 있습니다. 그리고 저는 Postgres를 사용하고 있습니다.

+0

"피드", "user_feeds"및 "he"가 무엇인지 설명해야한다고 생각합니다. 관심있는 다른 테이블이 있습니까? 사용자 ID가 1, 2, 5 등이 테이블에 저장되어 있습니까? – ChrisJ

+0

피드 : ID가, user_feeds를 feed_type : | 코멘트 | 등 같은]이 사람이 뭔가 (예를 들어 사진)를 좋아하는 경우에 기본적으로, 엔트리가 이루어집니다 아이디, 이름 feed_type는 = 아이디, FEED_ID, 사용자를 USER_ID "피드"테이블에 저장되고 항목은 사진에 포함 된 사용자의 user_feeds 테이블에 작성됩니다. 예 1,2,5 ... 사용자 ID입니다. –

답변

11

PostgreSQL이 처리 할 수있는 최대 쿼리 길이는 2147483648 자 (부호있는 4 바이트 정수, src/include/lib/stringinfo.h 참조)입니다.

4

쿼리 크기를 피하려면 IN (1, 2)을 IN으로 바꾸거나 (follower_id =?) follower_id =?를 따르거나 followers_id =?에서 팔로우 한 사용자의 ID를 찾으려면 무엇이든지 쿼리를 바꿀 수 있습니다. 신분증.

+0

아, 그게 더 쉬운 방법입니다. –

1

하위 쿼리를 사용하여 원본 WHERE 절의 IN 부분을 구성 할 수 있습니다. 결과는 다음과 같을 것입니다 :

"SELECT f. * FROM f, user_feeds uf WHERE (f.id = uf.feed_id 및 uf.user_id in) (follower = id 일 때 추종) ORDER BY created_at DESC "

분명히 내가 게시 한 것처럼 하위 쿼리가 적합하지 않지만 일반적인 생각을 제공해야합니다.

+0

예. 고마워, 내가 그걸 할거야. –

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; 
0

질의 스트링의 길이에는 (진짜) 제한은 없지만, IN (X, Y, Z ...) 조항의 수에 한계가있다

참조 : 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 설정에 따라 달라집니다"

다음 postgres.ini 파일에서 구성 할 수 있습니다 만, ... "8.0 이상에서는 max_expr_depth가 없어지고 한도는 max_stack_depth에 따라 다릅니다."