2009-02-27 22 views
6

Tôi có một truy vấn trong ứng dụng chạy rất nhanh khi có nhiều hàng trong bảng của tôi. Nhưng khi số lượng hàng là một kích thước vừa phải (không lớn và nhỏ) - cùng một truy vấn chạy chậm hơn 15 lần.Những cạm bẫy khi thiết lập enable_nestloop là OFF

Kế hoạch giải thích cho thấy truy vấn trên tập dữ liệu cỡ trung bình đang sử dụng vòng lồng nhau cho thuật toán kết hợp của nó. Tập dữ liệu lớn sử dụng kết nối được băm.

Tôi có thể ngăn cản người lập kế hoạch truy vấn sử dụng vòng lặp lồng nhau ở cấp cơ sở dữ liệu (postgresql.conf) hoặc mỗi phiên (SET enable_nestloop TO off).

Những cạm bẫy tiềm năng của set enable_nestloop to off là gì?

Thông tin khác: PostgreSQL 8.2.6, chạy trên Windows.

Trả lời

7

Tiềm năng tiềm ẩn của việc thiết lập enable_nestloop đến off là gì?

Điều này có nghĩa là bạn sẽ không bao giờ có thể sử dụng chỉ mục một cách hiệu quả.

Và có vẻ như bạn hiện không sử dụng chúng.

Các truy vấn như thế này:

SELECT u.name, p.name 
FROM users u 
JOIN profiles p ON p.id = u.profile_id 
WHERE u.id = :id 

có lẽ hầu hết sẽ sử dụng NESTED LOOPS với một trên user.id và một trên profile.id, với điều kiện là bạn đã xây dựng các chỉ số trên các lĩnh vực này.

Truy vấn có bộ lọc chọn lọc thấp (nghĩa là các truy vấn cần nhiều hơn 10% dữ liệu từ các bảng mà chúng sử dụng) sẽ được hưởng lợi từ MERGE JOINSHASH JOINS.

Nhưng các truy vấn giống như các truy vấn được đưa ra ở trên yêu cầu NESTED LOOPS để chạy hiệu quả.

Nếu bạn đăng truy vấn và định nghĩa bảng ở đây, có lẽ nhiều việc có thể được thực hiện về hiệu suất chỉ mục và truy vấn.

4

Một vài điều cần xem xét trước khi dùng các biện pháp quyết liệt như:

  • nâng cấp cài đặt của bạn đến 8.2.x mới nhất (mà ngay bây giờ là 8.2.12). Thậm chí tốt hơn - hãy xem xét nâng cấp lên phiên bản ổn định tiếp theo là 8.3 (8.3.6).

  • xem xét thay đổi nền tảng sản xuất của bạn thành một thứ khác ngoài Windows. Cổng Windows của PostgreSQL, mặc dù rất hữu ích cho mục đích phát triển, vẫn không ngang bằng với Un * x.

  • đọc đoạn đầu tiên của "Planner Method Configuration". Điều này wiki page có lẽ sẽ giúp quá.

1

Tôi có cùng trải nghiệm giống nhau. Một số truy vấn trên một cơ sở dữ liệu lớn được thực hiện bằng cách sử dụng vòng lặp lồng nhau và mất 12 giờ !!!khi nó chạy trong 30 giây khi tắt các vòng lặp lồng nhau hoặc xóa các chỉ mục.

Có gợi ý sẽ thực sự thoải mái ở đây, nhưng tôi đã cố gắng

... 
SET ENABLE_NESTLOOP TO FALSE; 
... critical query 
SET ENABLE_NESTLOOP TO TRUE; 
... 

để đối phó với vấn đề này. Vì vậy, bạn chắc chắn có thể vô hiệu hóa và kích hoạt lại sử dụng vòng lặp lồng nhau, và bạn không thể tranh luận với tốc độ tăng gấp 9000 lần :)

Một vấn đề tôi phải làm là thay đổi ENABLE_NESTLOOP trong thủ tục PgSQL/PL. Tôi có thể chạy một kịch bản SQL trong Aqua Data Studio làm mọi thứ đúng, nhưng khi tôi đặt nó trong một thủ tục PgSQL/PL, nó vẫn mất 12 giờ. Rõ ràng nó đã bỏ qua sự thay đổi.

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