Probeer deze herschreven versie:
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-syntaxis en volgorde van samenvoegingen
In het bijzonder heb ik de misleidende LEFT JOIN
. opgelost naar conciliacao_vendas
, die wordt gedwongen om op te treden als een gewone [INNER] JOIN
door de latere WHERE
voorwaarde toch. Dit zou de queryplanning moeten vereenvoudigen en het mogelijk maken om rijen eerder in het proces te elimineren, wat alles een stuk goedkoper zou moeten maken. Gerelateerd antwoord met gedetailleerde uitleg:
USING
is slechts een syntactische steno.
Aangezien er veel tabellen bij de query betrokken zijn en de volgorde waarin de herschreven query zich bij tabellen voegt nu optimaal is, kunt u dit verfijnen met SET LOCAL join_collapse_limit = 1
om planningsoverhead te besparen en inferieure queryplannen te vermijden. Uitvoeren in een enkele transactie :
BEGIN;
SET LOCAL join_collapse_limit = 1;
SELECT ...; -- read data here
COMMIT; -- or ROOLBACK;
Meer daarover:
- Voorbeeldquery om de schattingsfout van de kardinaliteit in PostgreSQL weer te geven
- De fijne handleiding over De planner besturen met expliciete JOIN-clausules
Index
Voeg enkele indexen toe aan opzoektabellen met lots of rijen (niet nodig voor slechts enkele tientallen), in het bijzonder (overgenomen uit uw queryplan):
Dat is bijzonder vreemd, omdat die kolommen eruitzien als primaire sleutelkolommen en zou al hebben een index ...
Dus:
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);
Om dit echt dik te maken, een multicolumn index zou van grote dienst zijn:
CREATE INDEX foo ON Table1 (parcela, data_venda, data_credito);