Pegando carona no tópico...

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Aproveitando o tópico, uma curiosidade. O que é mais rápido: count ou exists?

Exemplo bem grosseiro:

Selecionar tudo

SELECT PESSOA.CODIGO, PESSOA.NOME
  FROM PESSOA
 WHERE EXISTS (SELECT * 
                 FROM VENDAS
                WHERE VENDAS.COD_PESSOA = PESSOA.COD)
ou

Selecionar tudo

SELECT PESSOA.CODIGO, PESSOA.NOME
  FROM PESSOA
 WHERE (SELECT COUNT(*) 
          FROM VENDAS
         WHERE VENDAS.COD_PESSOA = PESSOA.COD) > 0
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Era pra responder o tópico referente a exists... desculpem pelo tópico inútil.
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Se a finalidade é apenas determinar a existência um registro na tabela, com certeza o exists tem desempenho melhor.

Internamente, a consulta da cláusula exists será realizada, mas os dados não chegarão a ser recuperados, o comando irá retornar true assim que a primeira linha que satisfaça a condição for encontrada, ou false caso não exista tal registro.

Já no caso do count, além de realizar a consulta, o banco irá recuperar TODOS os registros que satisfaçam esta condição (a diferença de performance fica bem clara quando esta query retorna muitos registros, especialmente caso não exista um índice que possa ser utilizado com as condições definidas na consulta) contar a quantidade de registros, que será então retornada para a query de nível superior.
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

E no caso de NOT EXISTS e COUNT = 0? Para avaliar se não existe, a tabela deve ser verificada até o fim. Nesse caso, o desempenho seria o mesmo?
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Marciel,

A situação é quase a mesma.
Caso não exista mesmo um registro, ambos os comandos devem se comportar da mesma forma.

No entanto, caso a subquery venha a retornar vários registros, o not exists e o count = 0 irão se comportar da mesma forma (o not exists irá retornar false já no primiero registro encontrado, enquanto o count irá contar todos os registros retornados, para depois comparar o resultado com o valor 0).
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

E nesse caso, qual o melhor desempenho?

Selecionar tudo

SELECT PESSOA.CODIGO, PESSOA.NOME
  FROM PESSOA
 WHERE EXISTS (SELECT *
                 FROM VENDAS
                WHERE VENDAS.COD_PESSOA = PESSOA.COD)
ou

Selecionar tudo

SELECT PESSOA.CODIGO, PESSOA.NOME
  FROM PESSOA
 WHERE PESSOA.COD IN (SELECT VENDAS.COD_PESSOA
                        FROM VENDAS)
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 9 visitantes