sql >> データベース >  >> RDS >> PostgreSQL

クエリpostgresを最適化する方法

    この書き直されたバージョンを試してください:

    SELECT fat.*   
    FROM   Table1 fat
    JOIN   conciliacao_vendas cv USING (empresa_id, chavefato, rede_id)
    JOIN   loja lj               ON lj.id = fat.loja_id  
    JOIN   rede rd               ON rd.id = fat.rede_id  
    JOIN   bandeira bd           ON bd.id = fat.bandeira_id  
    JOIN   produto pd            ON pd.id = fat.produto_id  
    JOIN   loja_extensao le      ON le.id = fat.loja_extensao_id  
    JOIN   conta ct              ON ct.id = fat.conta_id
    JOIN   banco bc              ON bc.id = ct.banco_id
    LEFT   JOIN modo_captura mc  ON mc.id = fat.modo_captura_id  
    WHERE  cv.controle_upload_arquivo_id = 6906  
    AND    fat.parcela = 1  
    ORDER  BY fat.data_venda, fat.data_credito
    LIMIT  20;
    

    JOIN構文と結合のシーケンス

    特に、誤解を招くLEFT JOINを修正しました conciliacao_vendasへ 、プレーンな[INNER] JOINとして機能するように強制されます 後のWHEREによって とにかく状態。これにより、クエリプランニングが簡素化され、プロセスの早い段階で行を削除できるようになり、すべてが大幅に安価になります。詳細な説明付きの関連回答:

    USING 単なる構文の省略形です。

    クエリには多くのテーブルが関係しており、書き換えられたクエリがテーブルを結合する順序が最適になっているため、SET LOCAL join_collapse_limit = 1を使用してこれを微調整できます。 計画のオーバーヘッドを節約し、劣ったクエリプランを回避します。 単一のトランザクションで実行する

    BEGIN;
    SET LOCAL join_collapse_limit = 1;
    SELECT ...;  -- read data here
    COMMIT;      -- or ROOLBACK;
    

    詳細:

    インデックス

    特に(クエリプランから取得した)ロットまたは行を含むルックアップテーブルにいくつかのインデックスを追加します(数十の場合は必要ありません):

    これらの列は主キー列のように見えるため、これは特に奇妙です。 すでに持っているはずです インデックス...

    だから:

    CREATE INDEX conta_pkey_idx ON public.conta (id);
    CREATE INDEX loja_pkey_idx ON public.loja (id);
    CREATE INDEX loja_extensao_pkey_idx ON public.loja_extensao (id);
    

    これを本当に太くするには、複数列のインデックス 素晴らしいサービスになるでしょう:

    CREATE INDEX foo ON Table1 (parcela, data_venda, data_credito);
    



    1. PowerShellを使用してパラメーターのデフォルト値を解析する–パート1

    2. SQL Server 2019の最初のパブリックプレビュー:CTP 2.0

    3. 行IDを含むmysqlの合計

    4. SQLの単一のクエリでカテゴリとサブカテゴリをフェッチするにはどうすればよいですか? (mysql)