Disseram-me que ao verificar a existência de uma linha em uma tabela, isso funcionará:
EXISTS(SELECT 1 FROM....)
mas que uma maneira "melhor" em relação ao desempenho rápido da consulta seria usar isto:
EXISTS(SELECT TOP(1) NULL FROM......)
Pesquisei on-line por qualquer coisa que faça referência a essa comparação e a única informação que encontrei diz que essa é uma preferência pessoal e que, na verdade, não há ganho de desempenho de um em relação ao outro. Sempre existe o aspecto "caso a caso" em uma pergunta como essa, mas, em geral, há algum ganho de desempenho com o uso da segunda implementação EXISTS()
em vez da primeira?
Para ter certeza, você teria que verificar os planos de execução.
Mas é quase certo, dada a trivialidade da otimização, que o compilador sempre descartará o seguinte no nível superior de an
EXISTS
, pois eles não afetam a semântica:SELECT
as colunasDISTINCT
TOP
ORDER BY
Tudo o que você está fazendo é verificar se existe alguma linha, e nenhuma dessas construções pode reduzi-la a zero.
Observe que isso nem sempre é verdade: existem algumas construções que irão interagir e preservar alguns desses recursos devido à sua semântica. Por exemplo:
OFFSET FETCH
INTERSECT/EXCEPT
(mas nãoUNION
)SELECT NULL
.A prática comum é usar
SELECT 1
ouSELECT NULL
.Para maior clareza, sempre escrevo an
EXISTS
com theSELECT
na mesma linha e theFROM
na próxima, mostrando que theSELECT
é realmente apenas sintaxe, assim:Em alguns SGBDs, você pode até omitir completamente as colunas