PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

अलग-अलग निष्पादन समय को फ़िल्टर करते समय एक ही फ़ील्ड का उपयोग क्यों करते हैं? (विभिन्न सूचकांक उपयोग)

समस्या समाधान के रूप में हम इसके अतिरिक्त SELECT . कर सकते हैं PARTITION BY . में उपयोग किए जाने वाले कॉलम के लिए एक उपनाम अभिव्यक्ति। फिर PG अनुकूलन लागू करें और अनुक्रमणिका का उपयोग करें।

प्रश्न का उत्तर यह हो सकता है:यदि समग्र प्रकार का उपयोग किया जाता है . तो PG अनुकूलन लागू नहीं करता है . सूचना के रूप में यह काम करता है:

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

देखें यह dbfiddle

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. सी # पोस्टग्रेज डेटाबेस से जुड़ रहा है

  2. एक ही प्राथमिक कुंजी के लिए एक मैप किए गए वर्ग में SQLAlchemy एकाधिक विदेशी कुंजी

  3. किसी अन्य चयन से लौटाई गई पंक्तियों की संख्या के आधार पर ऑर्डर करने की क्वेरी

  4. Postgres . में एन्क्रिप्टेड फ़ील्ड खोजना

  5. डॉकटर में होस्ट के लिए लोकलहोस्ट और पोस्टग्रेज के बीच अंतर