domingo, 27 de abril de 2008

SQL Server - Usando a função EXISTS

Em diversas situações nos vemos obrigados a usar uma função que verificar se um determinado registro existe antes de decidir o que será feito. Um exemplo típido e quando queremos determinar se vamos atualizar ou criar um registro. É ai que entra a função EXISTS.

  • Exemplo: 
    if EXISTS (select *
    from authors
    where au_id = '172-32-1176')
    Print 'O registro já existe - Executaremos um Update'
    ELSE
    Print 'O registro não existe - Vamos executar um Insert'

A função recebe um único parâmetro, que é uma instrução SQL. Se para a instrução SQL passada registros existirem, a função irá retornar TRUE, do contário, retornará FALSE.

A vantagem do uso do EXISTS é que assim que ele encontra o primeiro registro, o processo é interrompido, salvando então recursos do servidor SQL, embora se a pesquisa estiver sendo feita em cima de uma PRIMARY KEY, a diferença não seja muito grande entre um e outro. Entretanto, haverá um enorme ganho de performance se você estiver fazendo busca por qualquer outro campo não indexado.

Observer esses dois exemplos:

  • if exists (select *
    from authors
    where state = 'ca')
    Print 'Registro Existe'
    ELSE
    Print 'Registro não existe'

    if (select count(*)
    from authors
    where state = '172-32-1176') > 0
    Print 'Registro existe'
    ELSE
    Print 'Registro não existe'

Examinando os bancos default do MS-SQL SERVER, na database "pubs", tabela "authors" existem somente 23 registros. Mesmo com tão poucos registros, a query com o IF EXISTS é executada 4 vezes mais rápido do que um "select count". Isso porque a query pára a sua execução assim que o primeiro registro é encontrado. Já no segundo exemplo, todos os registros que atenderem a condição serão processados (retornados).

É isso ai :)

2 comentários:

Anônimo disse...

ajudou muito, obrigado.

Alan disse...

Muito bom, obrigado.