PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zoptymalizować postgres zapytania

Wypróbuj tę przepisaną wersję:

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;

Składnia JOIN i sekwencja złączeń

W szczególności naprawiłem mylące LEFT JOIN do conciliacao_vendas , który jest zmuszony do działania jako zwykły [INNER] JOIN przez późniejsze WHERE stan tak czy inaczej. Powinno to uprościć planowanie zapytań i pozwolić na eliminację wierszy na wcześniejszym etapie procesu, co powinno sprawić, że wszystko będzie dużo tańsze. Powiązana odpowiedź ze szczegółowym wyjaśnieniem:

USING to tylko skrót składniowy.

Ponieważ w zapytaniu zaangażowanych jest wiele tabel, a kolejność, w jakiej przepisane zapytanie łączy tabele, jest teraz optymalna, można to dostroić za pomocą SET LOCAL join_collapse_limit = 1 aby zaoszczędzić na kosztach planowania i uniknąć gorszych planów zapytań. Uruchom w pojedynczej transakcji :

BEGIN;
SET LOCAL join_collapse_limit = 1;
SELECT ...;  -- read data here
COMMIT;      -- or ROOLBACK;

Więcej na ten temat:

Indeks

Dodaj indeksy do tabel przeglądowych z partiami lub wierszami (nie jest to konieczne tylko dla kilkudziesięciu), w szczególności (pobrane z planu zapytań):

To szczególnie dziwne, ponieważ te kolumny wyglądają jak kolumny klucza głównego i powinien już mieć indeks ...

A więc:

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 było naprawdę tłuste, indeks wielokolumnowy byłoby bardzo pomocne:

CREATE INDEX foo ON Table1 (parcela, data_venda, data_credito);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Heroku:PG::ConnectionBad:nie można połączyć się z serwerem:Połączenie odrzucone

  2. Slick 2.0 Ogólne operacje CRUD

  3. Zwraca RDSdataService execute_statement (BadRequestException)

  4. Rekurencyjne zapytanie Postgres z row_to_json

  5. Pobierz nazwę miesiąca z daty w PostgreSQL