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

Tại sao sử dụng cùng một trường khi lọc lại gây ra thời gian thực thi khác nhau? (sử dụng chỉ mục khác nhau)

Để giải quyết vấn đề, chúng tôi cũng có thể SELECT bí danh cho cột được sử dụng tại PARTITION BY biểu hiện. Sau đó PG áp dụng chỉ mục tối ưu hóa và sử dụng.

Câu trả lời cho câu hỏi có thể là:PG không áp dụng tối ưu hóa nếu loại kết hợp được sử dụng . Lưu ý vì nó hoạt động:

PARTITION | FILTER | IS USED?
------------------------------
ALIAS     | ORIG   | NO
ALIAS     | ALIAS  | YES
ORIG      | ALIAS  | NO
ORIG      | ORIG   | NO

Xem dbfiddle này

create table agreement ( ag_id int, name text, cost numeric(10,2) );
create index ag_idx on agreement (ag_id);
insert into agreement (ag_id, name, cost) values ( 1, '333', 22 ),
(1,'333', 33), (1, '333', 7), (2, '555', 18 ), (2, '555', 2), (3, '777', 4);
select * from agreement;

create function initial () 
returns table( agreement_id int, ag agreement ) language sql stable AS $$
select ag_id, t from agreement t;
$$;
select * from initial() t;

explain( analyze, costs, buffers, verbose ) with totals_by_ag as (
  select 
    *,
    sum( (t.ag).cost ) over ( partition by agreement_id ) as total
  from initial() t
)
select * from totals_by_ag t
where (t.ag).ag_id = 1; -- index is NOT USED

explain( analyze, costs, buffers, verbose ) with totals_by_ag as (
  select 
    *,
    sum( (t.ag).cost ) over ( partition by agreement_id ) as total
  from initial() t
)
select * from totals_by_ag t
where agreement_id = 1; -- index is used when alias for column is used

explain( analyze, costs, buffers, verbose ) with totals_by_ag as (
  select 
    *,
    sum( (t.ag).cost ) over ( partition by (t.ag).ag_id ) as total --renamed
  from initial() t
)
select * from totals_by_ag t
where agreement_id = 1; -- index is NOT USED because grouping by original column

explain( analyze, costs, buffers, verbose ) with totals_by_ag as (
  select 
    *,
    sum( (t.ag).cost ) over ( partition by (t.ag).ag_id ) as total --renamed
  from initial() t
)
select * from totals_by_ag t
where (t.ag).ag_id = 1; -- index is NOT USED even if at both cases original column




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. UnknownHostException khi cố gắng kết nối với heroku-postgres từ dự án Springboot cục bộ với Spring JPA

  2. PostgreSQL / performance một con trỏ chung hoặc tạo cho mọi truy vấn

  3. Hàm cửa sổ LAG có thể tham chiếu đến cột mà giá trị đang được tính toán không?

  4. danh sách Postgres loại ENUM

  5. Hibernate 3.3.2GA tải không đúng dữ liệu bytea từ PostgreSQL 9.0 và tất cả các ánh xạ loại đều đúng