Olá Vinicius,

> From: vinicius perroni <[email protected]>
> Subject: [pgbr-geral] Otimizar consulta com LEFT JOIN

> Estou com um velho problema uma consulta minha utiliza muitos LEFT
> JOINS tornandoa lenta demais.
 
> A consulta é mais ou menos assim tenho uma tabela de orçamentos, uma
> de ordens de compras e outra de Notas Fiscas, três tabelas sendo o
> unico registro que certamente existe é o orçamento. Junto elas com
> LEFT JOIN ...
 
> Pensei em usar UNION mas ainda não realizei testes alguem tem alguma
> ideia para substituir os LEFT JOINS e otimizar a consulta?

Aplique a idéia de usar UNION ALL. Isso funciona em qualquer servidor SQL e
nunca vi piorar o desempenho da consulta. O que faço é o seguinte: para CADA
LEF OUTER JOIN da sua consulta, substitua por duas cópias da mesma query
separadas por UNION ALL (não union, tem de ser UNION ALL), sendo que numa
delas você vai trocar o LEFT OUTER JOIN por um INNER JOIN e na outra você
vai tirar fora o LEFT OUTER da tabela e incluir lá na cláusula WHERE a
condição AND NOT EXISTS(SELECT 1 FROM <suatabeladoleft> WHERE <joins que
estavam no LEFT>). Provavelmente você vai notar que ao por INNER na tabela
que antes era OUTER você poderá trocar um monte de OUTERs por INNERs nas
tabelas filhas dela também, o que ajudará ainda mais a melhorar o
desempenho.

A implicação disso é que, se tua query tem 2 LEFT OUTER, a combinação de
todos com todos vai resultar em 4 consultas separadas por UNION ALL. Nunca
precisei de mais do que 8. Não se assuste porque valerá a pena.
Sua query vai ficar grande, porém mesmo seis vezes maior ainda ficará muito
mais rápida que a original. Faço isso aqui direto com ótimos resultados.
Minha aplicação não sofreu nenhuma alteração na modelagem por conta
disso, porém com essas trocas para UNION ALL, o LEFT OUTER JOIN está virando
lenda por aqui, praticamente ninguém mais usa.

Atenciosamente,

Mozart Hasse


_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a