この書き直されたバージョンを試してください:
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);