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

Giải thích chi tiết hơn về đề xuất hiệu suất điều kiện JOIN so với LEFT JOIN và WHERE

Một cách hiệu quả, WHERE điều kiện và JOIN điều kiện cho [INNER] JOIN tương đương 100% trong PostgreSQL. (Bạn nên sử dụng JOIN rõ ràng tuy nhiên, điều kiện để làm cho truy vấn dễ đọc và dễ bảo trì hơn).

Tương tự là không true cho một LEFT JOIN được kết hợp với WHERE điều kiện trên một bảng ở bên phải của phép nối. Mục đích của LEFT JOIN là bảo toàn tất cả các hàng ở phía bên trái của phép nối, không có bất thường đối với kết quả khớp ở phía bên phải. Nếu không tìm thấy kết quả phù hợp nào, hàng sẽ được mở rộng bằng NULL giá trị cho các cột ở phía bên phải. Hướng dẫn sử dụng:

LEFT OUTER JOIN

Đầu tiên, một phép nối bên trong được thực hiện. Sau đó, đối với mỗi hàng trong T1 không thỏa mãn điều kiện nối với bất kỳ hàng nào trong T2, một hàng đã nối sẽ được thêm với giá trị null trong các cột của T2. Do đó, các đường bảng đã kết hợp có ít nhất một hàng cho mỗi hàng trong T1.

Nếu sau đó bạn áp dụng WHERE điều kiện yêu cầu một cái gì đó khác ngoài NULL giá trị trên các cột của bảng ở phía bên phải, bạn sẽ vô hiệu hóa hiệu ứng và buộc chuyển đổi LEFT [OUTER] JOIN để hoạt động như một [INNER] JOIN đơn giản , chỉ (có thể) tốn kém hơn do kế hoạch truy vấn phức tạp hơn.

Trong một truy vấn có nhiều bảng được kết hợp, Postgres (hoặc bất kỳ RDBMS nào) rất khó tìm ra kế hoạch truy vấn tốt nhất (hoặc thậm chí là tốt). Số lượng các trình tự có thể có về mặt lý thuyết để nối các bảng tăng lên về mặt thực tế (!). Postgres sử dụng "Trình tối ưu hóa Truy vấn Chung" cho nhiệm vụ và có một số cài đặt ảnh hưởng đến nó.

Làm xáo trộn truy vấn bằng LEFT JOIN gây hiểu lầm như đã nêu, làm cho công việc của trình lập kế hoạch truy vấn khó khăn hơn, gây hiểu lầm cho người đọc và thường gợi ý về các lỗi trong logic truy vấn.

Câu trả lời liên quan cho các vấn đề bắt nguồn từ điều này:

  • Tại sao null bằng số nguyên trong WHERE?
  • Truy vấn với LEFT JOIN không trả về các hàng có số lượng là 0
  • Truy vấn SQL sử dụng kết nối bên ngoài và giới hạn các bản ghi con cho mỗi phụ huynh
  • Liên kết bên ngoài trái hoạt động giống như liên kết bên trong
  • Chọn các hàng không có trong bảng khác

Vv.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiểu hiệu suất truy vấn PostgreSQL

  2. PostgreSQL:ERROR:42601:cần có danh sách định nghĩa cột cho các hàm trả về bản ghi

  3. Làm cách nào để so sánh ngày trong các trường datetime trong Postgresql?

  4. Sử dụng psql làm cách nào để liệt kê các tiện ích mở rộng được cài đặt trong cơ sở dữ liệu?

  5. Mười mẹo để bắt đầu sản xuất với PostgreSQL