sql >> Database >  >> RDS >> PostgreSQL

Hoe query postgre te optimaliseren

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:

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



  1. Mysql - EXPLAIN SELECT from a VIEW zoekt in alle rijen van de hoofdtabel

  2. mysql wat is de juiste syntaxis voor deze voorwaardelijke update-instructie?

  3. afbeelding naar byte [] opslaan in Mysql met asp.net en c#

  4. Zijn de rijen op volgorde vergrendeld in een SELECT ... ORDER BY ... FOR UPDATE-instructie?