Zkuste tuto přepsanou verzi:
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;
Syntaxe JOIN a sekvence spojení
Zejména jsem opravil zavádějící LEFT JOIN
na conciliacao_vendas
, který je nucen fungovat jako prostý [INNER] JOIN
podle pozdějšího WHERE
stav každopádně. To by mělo zjednodušit plánování dotazů a umožnit eliminovat řádky dříve v procesu, což by vše mělo výrazně zlevnit. Související odpověď s podrobným vysvětlením:
USING
je jen syntaktická zkratka.
Protože je v dotazu mnoho tabulek a pořadí, v jakém přepsaný dotaz spojuje tabulky, je nyní optimální, můžete to doladit pomocí SET LOCAL join_collapse_limit = 1
ušetřit režii plánování a vyhnout se horším plánům dotazů. Proveďte v jediné transakci :
BEGIN;
SET LOCAL join_collapse_limit = 1;
SELECT ...; -- read data here
COMMIT; -- or ROOLBACK;
Více o tom:
- Ukázkový dotaz k zobrazení chyby odhadu mohutnosti v PostgreSQL
- Výborná příručka o Ovládání plánovače s explicitním Klauzule JOIN
Index
Přidejte některé indexy do vyhledávacích tabulek s položkami nebo řádky (není nutné pouze pro několik desítek), zejména (převzato z vašeho plánu dotazů):
To je obzvláště zvláštní, protože tyto sloupce vypadají jako sloupky primárního klíče a měl by již mít index ...
Takže:
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);
Aby to bylo opravdu tlusté, vícesloupcový index by byla skvělá služba:
CREATE INDEX foo ON Table1 (parcela, data_venda, data_credito);