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
