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. CakePHP:ACLの設定が機能しない(テーブルが更新されない)ことを許可/拒否しますか?

    2. Oracleでレガシーの左外部結合ステートメントを変換するにはどうすればよいですか?

    3. 返されたMySQLクエリに番号付きリスト列を追加します

    4. エラー:関数dblink(不明、不明)が存在しません