Tôi có một truy vấn chạy chậm hơn rất nhiều (~ 5 phút) khi tôi chạy truy vấn đó với mặc định enable_nestloop = true và enable_nestloop = false (~ 10 giây).Postgresql - Truy vấn chạy nhanh hơn rất nhiều với enable_nestloop = false. Tại sao người lập kế hoạch không làm điều đúng?
Giải thích phân tích kết quả cho cả hai trường hợp:
máy A nestloop = true - http://explain.depesz.com/s/nkj0 (~ 5 phút) máy A nestloop = false - http://explain.depesz.com/s/wBM (~ 10 giây)
Trên một máy hơi chậm khác nhau , sao chép cơ sở dữ liệu qua và để mặc định enable_nestloop = true phải mất ~ 20 giây.
Máy B nestloop = true - (~ 20secs)
Đối với tất cả các trường hợp trên, chúng tôi đảm bảo rằng tôi đã làm một PHÂN TÍCH trước khi chạy các truy vấn. Không có truy vấn nào khác chạy song song.
Cả hai máy đang chạy Postgres 8.4. Máy A đang chạy Ubuntu 10.04 32 bit trong khi Máy B đang chạy Ubuntu 8.04 32 bit.
Truy vấn thực tế có sẵn tại đây. Nó là một truy vấn báo cáo với nhiều phép nối khi cơ sở dữ liệu chủ yếu được sử dụng để xử lý giao dịch.
Nếu không sử dụng để đặt thứ gì đó như quan điểm vật chất, tôi có thể làm gì để lập kế hoạch làm những gì tôi đạt được bằng cách đặt enable_nestloop = false?
Từ nghiên cứu tôi đã thực hiện dường như lý do nhà lập kế hoạch chọn truy vấn dường như không tối ưu là do sự khác biệt lớn giữa các hàng ước tính và thực tế. Làm thế nào tôi có thể có được con số này gần hơn?
Nếu tôi nên viết lại truy vấn, tôi nên thay đổi điều gì?
Tại sao trình lập kế hoạch có vẻ như đang làm điều đúng cho Máy B. Tôi nên so sánh gì ở cả hai máy?
Các liên kết từ câu hỏi ở trên đã bị xóa - truy vấn - http://pastie.org/2754424 – Mohan
Giải thích phân tích cho Máy B - http://explain.depesz.com/s/dYO – Mohan