Pessoal,
Alguém sabe me dizer qual é o problema de se usar em querys muitos ISNULL, se isso afeta o desempenho de alguma forma.
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…
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”.
desconsidera link.
Não tinha lido topico direito… desconheco esse metado.