Duvida sobre postgres, joins e left joins

Olá pessoal,
Seguinte

precisei criar umas rotinas em sql pra rodar elas no braço pra atualizar um volume grande de informações
e axei melhor criar varios updates e ir executando eles na sequencia um do outro e tals…

como padrao fiz um select e no resultado do select faço os updates…
meu select ficou assim mais ou menos

select [campos]
from tabela t
  inner join t_item ti on ti.ide = t.ide
  inner join i_item_especial itp on itp.ide_p = ti.ide_p
where [condições]

e demorava um minuto pra rodar...

entao fiz 


select [campos]
from tabela t
  inner join t_item ti on ti.ide = t.ide
where [condições]
and ti.ide_p in (select ide_p from i_item_especial)

e demorou muito tambm
dai resolvi apelar a sorte

select [campos]
from tabela t
  inner join t_item ti on ti.ide = t.ide
  left outer  join i_item_especial itp on itp.ide_p = ti.ide_p
where [condições]
and coalesce(itp.ide_p,'') <> ''


me digam por que a ultima consulta foi instantanea!!!
tá não vou mentir
3 segundos

mas sendo que todas outras demoravam 15,30,50 segundos

a base esta no postgres 8.04
valeu!!

Isso acontece porque a função coalesce não te retornará os registros null, apenas se todos os argumentos que você passou forem null. Assim, como há menos registros para retornar, a consulta se torna mais rápida.

Espero ter ajudado.

simples assim? hehe
no momento que faço o coalesce ele já filtra e depois filtra novamente com a condição diferente de vazio?
isso?

faz um explain na consulta e analisa melhor. http://www.postgresql.org/docs/8.1/static/sql-explain.html

Bom, se você não mudou nada nas condições, é porque o coalesce filtrou muitos registros antes do left join, e só depois disso fez o cruzamento. Possivelmente o otimizador de consultas do postgre filtrou registros pelo coalesce antes do left join por haver alguma foreign key indicando o cruzamento. Para melhorar desempenho em inner joins, o melhor é cruzar com chaves primárias.