sql >> Databáze >  >> RDS >> PostgreSQL

Jak optimalizovat dotaz postgres

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:

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



  1. Strom vztahů (rodinného) obchodu MySQL

  2. Plánování kapacit pomocí údajů o výkonu

  3. PHP a MySQL - jak se vyhnout heslu ve zdrojovém kódu?

  4. Chyba formuláře/databáze Django:hodnota je příliš dlouhá pro typový znak se liší (4)