>
>
> 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.
>

Hey, esta é uma dica que deveria ser documentada em algum lugar. Dava um bom
texto para o wiki ou para um blog.

Muito bom mesmo.

[]s
-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [email protected]
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a