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

PostgresSQL Nested Loops - Khi nào người lập kế hoạch quyết định sử dụng Nested Loop khi thực hiện INNER JOIN?

Người lập kế hoạch không quyết định sử dụng một chiến lược tham gia nhất định dựa trên lý luận sâu sắc, mà chỉ đơn giản là xây dựng tất cả các chiến lược tham gia có thể có, ước tính chi phí và chọn chiến lược rẻ nhất.

Điều đó nói rằng, các phép nối vòng lặp lồng nhau thường là lựa chọn tốt nhất nếu bảng bên ngoài nhỏ, để vòng lặp bên trong không phải thực thi thường xuyên. Ngoài ra, một chỉ mục về điều kiện kết hợp của bảng bên trong có thể làm giảm đáng kể chi phí của một phép nối vòng lặp lồng nhau và làm cho nó trở thành một chiến lược hấp dẫn.

Trong trường hợp của bạn, lựa chọn tồi là do ước tính sai:

Foreign Scan on wind_forecast_recent w  (cost=... rows=1 ...) (actual ... rows=7 ...)

Điều đó làm cho vòng lặp bên trong được thực thi 7 lần thay vì một lần, do đó thời gian thực hiện là 70 giây thay vì 10 giây.

Bạn nên thu thập thống kê bảng trên wind_forecast_recent :

ANALYZE wind_forecast_recent;

Hãy nhớ rằng tự động phân tích không không trị bàn nước ngoài; bạn phải tự mình lo liệu điều đó.

Nếu điều đó không hiệu quả, bạn có thể thử đặt use_remote_estimate trên bảng ngoại và đảm bảo rằng thống kê bảng là chính xác trên cơ sở dữ liệu từ xa.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chênh lệch múi giờ trong giờ làm việc

  2. Truy xuất N bản ghi đầu tiên của mảng JSON bằng truy vấn Postgresql

  3. Postgres bao bọc kết quả truy vấn con trong dấu ngoặc đơn

  4. Postgres:chuyển đổi một hàng thành nhiều hàng (bỏ chia)

  5. Giới hạn tham gia vào một hàng