Опитайте тази пренаписана версия:
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;
Повече за това:
- Примерна заявка за показване на грешка при оценка на кардиналността в PostgreSQL
- Добрият наръчник за Контролиране на Planner с Explicit Клаузи JOIN
Индекс
Добавете някои индекси към справочни таблици с партиди или редове (не е необходимо само за няколко десетки), по-специално (взети от вашия план за заявка):
Това е особено странно, защото тези колони изглеждат като колони с първичен ключ и вече трябва да има индекс ...
И така:
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);