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

Hiệu suất khác biệt:điều kiện được đặt tại mệnh đề INNER JOIN so với WHERE

Lý do mà bạn thấy sự khác biệt là do kế hoạch thực thi mà người lập kế hoạch đang đặt cùng nhau, điều này rõ ràng là khác nhau tùy thuộc vào truy vấn (có thể cho rằng nên tối ưu hóa 2 truy vấn giống nhau và đây có thể là một lỗi ). Điều này có nghĩa là người lập kế hoạch nghĩ rằng nó phải hoạt động theo một cách cụ thể để đạt được kết quả trong mỗi câu lệnh.

Khi bạn làm điều đó trong JOIN, người lập kế hoạch có thể sẽ phải chọn từ bảng, lọc theo phần "Đúng", sau đó nối các tập kết quả. Tôi sẽ tưởng tượng đây là một bảng lớn và do đó có rất nhiều dữ liệu để xem qua và nó không thể sử dụng các chỉ mục một cách hiệu quả.

Tôi nghi ngờ rằng nếu bạn làm điều đó trong mệnh đề WHERE, người lập kế hoạch đang chọn một tuyến đường hiệu quả hơn (tức là dựa trên chỉ mục hoặc tập dữ liệu được lọc trước).

Bạn có thể làm cho phép nối hoạt động nhanh hơn (nếu không nhanh hơn) bằng cách thêm chỉ mục trên hai cột (không chắc liệu các cột được bao gồm và nhiều chỉ mục cột đã được hỗ trợ trên Postgres chưa).

Tóm lại, vấn đề của người lập kế hoạch là nó đang chọn 2 con đường khác nhau để đi đến các tập kết quả, và một trong những con đường đó không hiệu quả bằng con đường còn lại. Chúng tôi không thể biết lý do là gì nếu không có thông tin bảng đầy đủ và thông tin PHÂN TÍCH GIẢI THÍCH.

Nếu bạn muốn có thông tin cụ thể về lý do tại sao truy vấn cụ thể của bạn lại thực hiện điều này, bạn sẽ cần cung cấp thêm thông tin. Tuy nhiên, lý do là người lập kế hoạch chọn các tuyến đường khác nhau.

Tài liệu đọc bổ sung:

http://www.postgresql.org/docs/current/static/explicit-joins.html

Chỉ lướt qua, có vẻ như người lập kế hoạch postgres không sắp xếp lại thứ tự các phép nối để tối ưu hóa nó. hãy thử thay đổi thứ tự của các phép nối trong câu lệnh của bạn để xem liệu sau đó bạn có nhận được hiệu suất tương tự hay không ... chỉ là suy nghĩ.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lập chỉ mục ando:Chỉ mục GIN

  2. Khi nào thì chọn khóa và mở khóa cập nhật?

  3. Sử dụng truy vấn Hibernate:dấu hai chấm được coi là tham số / dấu hai chấm thoát

  4. Chọn (truy xuất) tất cả các bản ghi từ nhiều lược đồ bằng Postgres

  5. Quản lý tính khả dụng cao trong PostgreSQL - Phần III:Patroni