PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да оптимизирам заявката postgres

Опитайте тази пренаписана версия:

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 и последователност от съединения

По-специално поправих подвеждащия LEFT JOIN до conciliacao_vendas , който е принуден да действа като обикновен [INNER] JOIN от по-късния WHERE състояние все пак. Това трябва да опрости планирането на заявките и да позволи елиминирането на редове по-рано в процеса, което трябва да направи всичко много по-евтино. Свързан отговор с подробно обяснение:

USING е просто синтактична стенограма.

Тъй като има много таблици, включени в заявката и редът, в който пренаписаната заявка се присъединява към таблици, сега е оптимален, можете да го настроите фино с SET LOCAL join_collapse_limit = 1 за да спестите разходи за планиране и да избегнете по-лоши планове за заявки. Изпълнение в една транзакция :

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

Повече за това:

Индекс

Добавете някои индекси към справочни таблици с партиди или редове (не е необходимо само за няколко десетки), по-специално (взети от вашия план за заявка):

Това е особено странно, защото тези колони изглеждат като колони с първичен ключ и вече трябва да има индекс ...

И така:

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

За да направите това наистина дебело, индекс в няколко колони ще бъде от голяма полза:

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. Как да приложим функция към всеки елемент от колона на масив в Postgres?

  2. Вземете датата на създаване на база данни в PostgreSQL

  3. Възможно ли е да се дефинират глобални променливи в postgresql

  4. Функция PostgreSQL age():различни/неочаквани резултати при кацане в друг месец

  5. Използвайте двоична таблица COPY FROM с psycopg2