PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tại sao truy vấn tự nhiên nhất (tức là sử dụng INNER JOIN (thay vì LEFT JOIN)) rất chậm

(theo chỉ dẫn, tôi đang đưa một phần nhận xét của mình vào câu trả lời vì nó giải quyết được vấn đề)

Chuyển đổi biểu thức EXISTS thành biểu thức IN.

Điều này hoạt động tốt hơn trong trường hợp này vì truy vấn bây giờ sẽ được đánh giá hiệu quả từ "trong ra ngoài" bắt đầu với truy vấn có chứa yếu tố hạn chế nhất của bạn:tra cứu tìm kiếm toàn văn. Truy vấn đó sẽ trả về một tập hợp nhỏ các hàng có thể được tra cứu trực tiếp với khóa chính của truy vấn bên ngoài (WHERE x in (SELECT X ...)) thay vì gọi truy vấn "bên trong" một lần cho mỗi giá trị của truy vấn bên ngoài (hoặc cho tất cả các giá trị trong trường hợp ban đầu của bạn, nếu tôi đang đọc nó một cách chính xác). Phương thức EXISTS ở đây tạo ra các Vòng lặp lồng nhau (một đánh giá của một truy vấn cho mỗi giá trị trong một giá trị khác) so với phương pháp IN sử dụng Hash Joins (một phương pháp thực thi hiệu quả hơn nhiều trong nhiều trường hợp, nếu không phải là hầu hết,.

Lưu ý rằng với phương thức EXISTS, có bốn Vòng lặp lồng nhau thực thi với mỗi vòng chạy ít nhất 3.000 lần. Chi phí đó cộng lại. Mặc dù đây không phải là so sánh trực tiếp, nhưng bạn có thể xử lý các Vòng lặp lồng nhau giống như cách bạn xử lý vòng lặp FOR trong mã ứng dụng:mỗi khi bạn gọi một vòng lặp bên trong, ước tính big-O của bạn tăng theo thứ tự độ lớn:O (n) đến O (n ^ 2) đến O (n ^ 3), v.v.

Hash Join giống như một bản đồ, trong đó hai mảng được bước qua cùng một lúc và một hoạt động được thực hiện trên cả hai. Đây là gần đúng tuyến tính (O (n)). Hãy coi những thứ này được lồng vào nhau như một phụ gia, vì vậy nó sẽ chuyển O (n) thành O (2n) thành O (3n), v.v.

Vâng, vâng, tôi biết nó không hoàn toàn giống nhau, nhưng vấn đề là việc có nhiều vòng lặp lồng nhau thường chỉ ra một kế hoạch truy vấn chậm và so sánh hai kiểu big-O sẽ giúp bạn dễ dàng nhận ra hơn.

Vòng lặp lồng nhau và vòng lặp tồn tại không phải là xấu, nhưng đối với hầu hết các trường hợp có điều kiện bộ lọc cơ sở cuối cùng ảnh hưởng đến mọi thứ (ví dụ:tìm kiếm toàn văn trong câu hỏi), biểu thức IN (hoặc, trong một số trường hợp, một JOIN thích hợp) mang lại một kế hoạch hiệu quả hơn nhiều.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cột động trong postgres câu lệnh SELECT

  2. kiểm tra đơn vị với cơ sở dữ liệu trong bộ nhớ

  3. Tiết kiệm data.frame lớn vào PostgreSQL với R

  4. Trên Chèn:điểm tham chiếu cột không rõ ràng

  5. Ứng dụng Rails 3 với PostgreSQL - Lấy danh sách các tin nhắn được nhóm theo hội tụ