O problema do ISNULL

Pessoal,

Alguém sabe me dizer qual é o problema de se usar em querys muitos ISNULL, se isso afeta o desempenho de alguma forma.

Para saber se afeta o desempenho, use um analisador de queries para ver se a query em particular está efetuando um table scan ou outra coisa ineficiente.
Não é suficiente, na maior parte das vezes, simplesmente olhar uma query para ver se ela é eficiente; é necessário popular as tabelas e atualizar as estatísticas.

Outra pergunta. Como eu poderia remover o ISNULL desse código sem afetar o objetivo da query:

private static String listaPosicaoExtrair() {

StringBuffer query = new StringBuffer();

query.append("	SELECT min(DtExtrair) DtExtrair, NmResumidoTestes, TbExemplo2.CdTestes,TbExemplo2.cdIndica,TbExemplo2Grupo.DdCalcular ");
query.append(" FROM TbExemplo, TbExemplo2 , TbExemplo2Operacional, TbExemplo2Grupo");
query.append(" WHERE   ");
query.append(" TbExemplo.CdTestes = TbExemplo2.CdTestes ");
query.append(" AND TbExemplo2.CdTestes = TbExemplo2Operacional.CdTestes ");
query.append(" AND TbExemplo2.CdTestes = ISNULL(?, TbExemplo2.CdTestes)  ");//remover o ISNULL
query.append(" AND (ativo = '1' or (ativo = '2' and dtInativo > ?))");
query.append(" GROUP BY NmResumidoTestes, TbExemplo2.CdTestes,TbExemplo2.cdIndica,TbExemplo2Grupo.DdCalcular ");

return query.toString();
}

Se é que isso é possível… :S

Use joins para relacionamentos.

Não entendi qual a necessidade desse ISNULL no seu codigo.

Amigo, aprenda a usar OUTER JOINs, que é o que você precisa. No seu caso acho que é um LEFT OUTER JOIN.

Estude um pouco, mas o que você fez eu nunca tinha visto antes. (Eu não tenho muita prática com SQL e estou sem tempo de analisar sua query).

Pode ser que seu banco seja tão velho que não aceite a sintaxe de JOINs; nesse caso, consulte a documentação (por exemplo, para Oracle 7 ou anterior, você precisa usar algo como tab1.campo1 (+) = tab2.campo2, e no SQL Server 6 ou anterior, tab1.campo *= tab2.campo ).

uma duvida…

Quando eu realizo minhas consultas sempre utilizo inner join ao inves de
select * from table1, table2 papapapa
a diferenca esta onde?

inner join primeiro filtra depois multiplica

e da outra maneira

multiplica depois filtra

alguem pode esclarecer?

Cara, o plano de execução de uma query é definida pelo banco na hora de executar, logo esse (multiplica X aplica) não é possivel saber…

mas o uso de joins facilita o entendimento, where faz filtro em uma consulta, join sim sao junções.

muitas pessoas(e isso não é errado) utilizam seus relacionamentos dentro da clausula where.

mas vejo só

select *
from pessoas p
join clientes c on(c.id_cliente = p.id_cliente)

select *
from pessoas, clientes
where c.id_cliente = p.id_cliente

Nessa situação, tudo bem são poucos relacionamentos…

mas pega uma assim.

select *
from pessoas p
join clientes c on(c.id_cliente = p.id_cliente)
join permissoes  pe on(pe.id_cliente = c.id_cliente)
join grupos g on(g.id_grupo = c.id_grupo)


select *
from pessoas p, clientes c, permissoes pe, grupos g
where pe.id_cliente = c.id_cliente
and g.id_grupo = c.id_grupo
and c.id_cliente = p.id_cliente

Olha a bagunca que fica sem os joins, tu já nao sabe mais quem relaciona quem …

Cara vlw pela “esclarecida” !!! espero que o postgres sempre acerte no plano de acao… :wink:

Nunca usei um join numa consulta com a keyword, sempre faço pela cláusula where. Na verdade nunca vi ninguém utilizar isso. Não vejo onde está a “bagunça”.

http://www.dba-oracle.com/oracle_tips_null_idx.htm

desconsidera link.
Não tinha lido topico direito… desconheco esse metado.