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

Toán tử PostgreSQL IN với hiệu suất kém truy vấn con

Có vẻ như cuối cùng tôi đã tìm ra giải pháp:

select * 
  from view1 
  where view1.id = ANY(
                       (select array(select ext_id 
                                     from aggregate_table 
                                     order by somedata limit 10)
                       )::integer[]
                      ) 
  order by view1.somedata;

Sau khi xây dựng ý tưởng của @ Dukeling:

Tôi nghi ngờ nơi id trong (1,2,3,4,5,6,7,8,9,10) có thể được tối ưu hóa và nơi id trong (select ...) không thể, lý do là (1,2 , 3,4,5,6,7,8,9,10) là một biểu thức hằng, trong khi select is not.

và định vị chúng trong kế hoạch truy vấn nhanh hơn

Recheck Cond: (id = ANY ('{1,2,3,4,5,6,7,8,9,10}'::integer[]))
Index Cond: (id = ANY ('{1,2,3,4,5,6,7,8,9,10}'::integer[]))

điều này thậm chí còn hoạt động nhanh hơn truy vấn đầu tiên trong câu hỏi, khoảng 1,2 mili giây và bây giờ nó sử dụng

Recheck Cond: (id = ANY ($1))
Index Cond: (id = ANY ($1))

và quét bitmap trong kế hoạch.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Biểu mẫu Django để truy vấn cơ sở dữ liệu (các mô hình)

  2. Cách đặt thời gian chờ kết nối trong SQLAlchemy

  3. Làm cách nào để lấy min / max của hai số nguyên trong Postgres / SQL?

  4. Hàm Postgres trả về bảng không trả về dữ liệu trong cột

  5. PostgreSQL tương đương với Oracle thu thập số lượng lớn