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

Làm cách nào để ngăn Postgres nội dòng một truy vấn con?

Tôi nghĩ OFFSET 0 là cách tiếp cận tốt hơn vì rõ ràng đây là một vụ hack cho thấy có điều gì đó kỳ lạ đang xảy ra và không chắc chúng tôi sẽ thay đổi hành vi tối ưu hơn xung quanh OFFSET 0 ... wheras hy vọng một lúc nào đó CTE sẽ trở nên nội tuyến CTE đã trở thành nội tuyến theo mặc định trong PostgreSQL 12. Giải thích sau là vì lợi ích của tính hoàn chỉnh; sử dụng câu trả lời của Seamus.

Đối với các truy vấn phụ không liên quan, bạn có thể khai thác PostgreSQL 11 trở lên từ chối nội tuyến WITH cụm từ truy vấn để diễn đạt lại truy vấn của bạn là:

WITH t AS (
    SELECT * FROM tbl WHERE id IN ('6d48fc431d21', 'd9e659e756ad')
)
SELECT COUNT(*) 
FROM t 
WHERE data ? 'building_floorspace' 
AND data ?| ARRAY['elec_mean_monthly_use', 'gas_mean_monthly_use'];

Điều này có cùng tác dụng với OFFSET 0 hack và thích offset 0 hack khai thác những điều kỳ quặc trong trình tối ưu hóa của Pg mà mọi người sử dụng để giải quyết vấn đề thiếu gợi ý truy vấn của Pg ... bằng cách sử dụng chúng làm gợi ý truy vấn.

Nhưng OFFSET 0 hack phần nào được chính thức ban phước, khi lạm dụng CTE không hoạt động nữa trong PostgreSQL 12. (Yay!).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Song song unnest () và sắp xếp thứ tự trong PostgreSQL

  2. Tính đa hình trong bảng cơ sở dữ liệu SQL?

  3. Rails 3.1:Truy vấn Postgres cho các bản ghi trong một phạm vi thời gian

  4. CTE đệ quy nối các trường với cha mẹ từ điểm tùy ý

  5. PostgreSQL:Tạm thời vô hiệu hóa các kết nối