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
  

Mensagemem Qui, 24 Jan 2008 1:45 pm

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

Exemplo bem grosseiro:

Código: Selecionar todos
SELECT PESSOA.CODIGO, PESSOA.NOME
  FROM PESSOA
WHERE EXISTS (SELECT *
                 FROM VENDAS
                WHERE VENDAS.COD_PESSOA = PESSOA.COD)


ou

Código: Selecionar todos
SELECT PESSOA.CODIGO, PESSOA.NOME
  FROM PESSOA
WHERE (SELECT COUNT(*)
          FROM VENDAS
         WHERE VENDAS.COD_PESSOA = PESSOA.COD) > 0
Marciel
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.

Mensagemem Qui, 24 Jan 2008 1:46 pm

Era pra responder o tópico referente a exists... desculpem pelo tópico inútil.
Marciel
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.

Mensagemem Qui, 24 Jan 2008 7:27 pm

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.
rogenaro
Localização: Londrina - PR

Rafael O. Genaro

Mensagemem Sex, 25 Jan 2008 8:17 am

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

Mensagemem Dom, 27 Jan 2008 6:48 pm

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).
rogenaro
Localização: Londrina - PR

Rafael O. Genaro

Mensagemem Sex, 01 Fev 2008 6:56 am

E nesse caso, qual o melhor desempenho?

Código: Selecionar todos
SELECT PESSOA.CODIGO, PESSOA.NOME
  FROM PESSOA
WHERE EXISTS (SELECT *
                 FROM VENDAS
                WHERE VENDAS.COD_PESSOA = PESSOA.COD)


ou

Código: Selecionar todos
SELECT PESSOA.CODIGO, PESSOA.NOME
  FROM PESSOA
WHERE PESSOA.COD IN (SELECT VENDAS.COD_PESSOA
                        FROM VENDAS)
Marciel
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.



Voltar para SQL

Quem está online

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