Prøv denne omskrevne version:
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-syntaks og sekvens af joinforbindelser
Især har jeg rettet den vildledende LEFT JOIN
til conciliacao_vendas
, som er tvunget til at fungere som en almindelig [INNER] JOIN
ved den senere WHERE
tilstand i hvert fald. Dette skulle forenkle planlægning af forespørgsler og gøre det muligt at fjerne rækker tidligere i processen, hvilket burde gøre alt meget billigere. Relateret svar med detaljeret forklaring:
USING
er blot en syntaktisk stenografi.
Da der er mange tabeller involveret i forespørgslen, og rækkefølgen, som den omskrevne forespørgsel forbinder tabeller med, er optimal nu, kan du finjustere dette med SET LOCAL join_collapse_limit = 1
for at spare planlægningsomkostninger og undgå ringere forespørgselsplaner. Kør i en enkelt transaktion :
BEGIN;
SET LOCAL join_collapse_limit = 1;
SELECT ...; -- read data here
COMMIT; -- or ROOLBACK;
Mere om det:
- Eksempelforespørgsel for at vise Cardinality-estimeringsfejl i PostgreSQL
- Den fine manual om styring af planlæggeren med eksplicit JOIN-klausuler
Indeks
Tilføj nogle indekser på opslagstabeller med partier eller rækker (ikke nødvendigt for kun et par dusin), især (taget fra din forespørgselsplan):
Det er særligt mærkeligt, fordi disse kolonner ligner primære nøglekolonner og burde allerede have et indeks ...
Så:
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);
For at gøre dette rigtig fedt, et flerkolonneindeks ville være til stor tjeneste:
CREATE INDEX foo ON Table1 (parcela, data_venda, data_credito);