2011-02-08 42 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 

Đây là truy vấn được sử dụng để tạo nguồn cấp dữ liệu của người dùng. Vấn đề tôi có với truy vấn này là "uf.user_id in()" tăng khi số lượng người dùng mà anh theo dõi tăng lên.Độ dài tối đa của truy vấn SQL

Độ dài tối đa cho phép của truy vấn SQL là bao nhiêu? Có cách nào tốt hơn để triển khai truy vấn trên của tôi không?

Lưu ý: Tôi đang sử dụng ActiveRecord. Và tôi đang sử dụng Postgres.

+0

Tôi nghĩ bạn cần giải thích "nguồn cấp dữ liệu" là gì, "user_feeds" và "anh ấy" là ai. Có bất kỳ bảng quan tâm nào khác không? Id người dùng 1, 2, 5, v.v ... có được lưu trữ trong bảng không? – ChrisJ

+0

feeds: id, feed_type user_feeds: id, FEED_ID, user_id người dùng: id, tên người dùng feed_type = [như | bình luận | vv] về cơ bản, khi ai đó thích một cái gì đó (chẳng hạn một bức ảnh) một mục được thực hiện trong bảng "nguồn cấp dữ liệu" và các mục nhập được tạo thành bảng user_feeds của người dùng được bao gồm trong ảnh. Có 1,2,5 ... là id người dùng –

Trả lời

11

Độ dài tối đa của truy vấn mà PostgreSQL có thể xử lý là 2147483648 ký tự (số nguyên 4 byte đã ký; xem src/include/lib/stringinfo.h).

4

Để tránh kích thước truy vấn, bạn có thể thay thế IN (1, 2) bằng IN (chọn follow_id từ sau ở đây follower_id =?) Hoặc bất kỳ truy vấn thích hợp nào sẽ tìm các id của người dùng theo sau từ người theo dõi ID.

+0

Ah, đó là cách dễ dàng hơn để viết. –

1

Bạn có thể xem xét sử dụng truy vấn phụ để xây dựng phần IN trong mệnh đề WHERE ban đầu của bạn. Vì vậy, kết quả sẽ trông giống như thế này:

"SELECT f. * TỪ nguồn cấp dữ liệu f, user_feeds uf WHERE (f.id = uf.feed_id và uf.user_id trong (SELECT theo sau nơi theo dõi = id)) ORDER BY created_at DESC "

Rõ ràng truy vấn phụ không đúng như tôi đã đăng, nhưng điều đó sẽ cho bạn ý tưởng chung.

+0

Đúng. Cảm ơn, tôi nghĩ rằng tôi sẽ làm điều đó. –

0

Sử dụng truy vấn phụ tương quan. Nếu bạn có bảng chứa người dùng thì thành viên theo dõi văn bản truy vấn của bạn sẽ không phát triển.

Ví dụ:

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

Trong khi không có (thực) giới hạn về độ dài của chuỗi truy vấn, có một giới hạn về số lượng IN (x, y, z ...) khoản : 10000, cấu hình trong postgres.ini-file:

Xem: http://grokbase.com/t/postgresql/pgsql-general/061mc7pxg6/what-is-the-maximum-length-of-an-in-a-b-c-d-list-in-postgresql: "trong 7.4 và trước đó nó phụ thuộc vào các thiết lập max_expr_depth"

... "Trong 8.0 và sau đó max_expr_depth đã biến mất và giới hạn tùy thuộc vào max_stack_depth".

Các vấn đề liên quan