sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan optimerer du forespørgsel postgres

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:

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);



  1. relevanssøgning på tværs af flere relaterede tabeller

  2. Referencealias (beregnet i SELECT) i WHERE-sætning

  3. mysql cross join, men uden duplikeret par?

  4. VB.NET MySQL-forbindelse