2010-03-11 29 views

Trả lời

4

Không có giới hạn về kỹ thuật, nhưng có một số loại 'cảm giác tốt' giới hạn ..

Có quá nhiều yếu tố trong mệnh đề TRÊN nghĩa là truy vấn có thể là một thiết kế xấu (IMHO)

+0

Bạn hầu như luôn có thể thay thế IN bằng một câu lệnh JOIN, trừ khi bạn có danh sách từ nguồn bên ngoài (không phải SQL). –

+0

@sf: vâng, hoàn toàn đồng ý. – Strae

+1

và nếu danh sách ở bên ngoài, bạn luôn có thể chèn nó vào bảng tạm thời và sau đó thực hiện tham gia, có thể sau khi tạo một số chỉ mục có thể trở thành một kế hoạch tốt – araqnid

0

Không, nhưng hãy cẩn thận khi sử dụng câu lệnh IN. Nếu bạn sử dụng truy vấn con trong câu lệnh IN của bạn, hiệu suất có thể bị ảnh hưởng tiêu cực vì SQL Server phải tạo toàn bộ tập kết quả và về cơ bản xây dựng một câu lệnh IF lớn tiềm ẩn trong nội bộ.

Ví dụ: một cái gì đó như Select * From MyTable where MyColumn IN (Select myColumn from AnotherTable) có thể hơi chậm nếu truy vấn phụ trả về một số lượng lớn hàng. Thông thường, nó sẽ hiệu quả hơn khi sử dụng EXISTS.

0

Tôi khá chắc chắn Postgres có giới hạn 1000 .... không thể tìm thấy bất kỳ docco nào để hỗ trợ điều đó.

+0

Đó có thể là Oracle. –

7

Giới hạn 1000 trong PostgreSQL không phải là giới hạn khó, đó là giới hạn tối ưu hóa, tức là; sau 1000 PostgreSQL không xử lý nó rất tốt. Tất nhiên tôi phải hỏi bạn đang làm gì với mệnh đề 1000 mục IN.

2

Tôi đã sử dụng nó, trong các truy vấn động được tạo cho postgres với sqlalchemy, với hơn 25k tham số. Ngoài ra, chúng được chuyển tới các hàm python thông qua các tham số vị trí (* args) .... nhưng tôi không nhận thấy sự chậm lại trong trường hợp của tôi. YMMV

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