sql - how - automatic query optimization



Sql: Como verificar corretamente se existe um registro (6)

É melhor usar um dos seguintes:

-- Method 1.
SELECT 1
FROM table_name
WHERE key = value;

-- Method 2.
SELECT COUNT(1)
FROM table_name
WHERE key = value;

A primeira alternativa deve dar-lhe nenhum resultado ou um resultado, a segunda contagem deve ser zero ou um.

Quantos anos tem a documentação que você está usando? Embora você tenha lido um bom conselho, a maioria dos otimizadores de consulta nos últimos RDBMS otimiza o SELECT COUNT(*) , portanto, embora haja uma diferença na teoria (e bancos de dados antigos), você não deve notar nenhuma diferença na prática.

Lendo alguma documentação do SQL Tuning , encontrei isto:

Select count(*) :
- Conta o número de linhas
- Freqüentemente é usado indevidamente para verificar a existência de um registro

É Select count(*) realmente tão ruim assim?

Qual é a maneira correta de verificar a existência de um registro?


As outras respostas são muito boas, mas também seria útil adicionar LIMIT 1 (ou o equivalente , para evitar a verificação de linhas desnecessárias.


Eu preferiria não usar a função Count.

IF [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... )
     <do smth>

Por exemplo, se você quiser verificar se o usuário existe antes de inseri-lo no banco de dados, a consulta pode ser assim:

IF NOT EXISTS ( SELECT 1 FROM Users WHERE FirstName = 'John' AND LastName = 'Smith' )
BEGIN
    INSERT INTO Users (FirstName, LastName) VALUES ('John', 'Smith')
END

Você pode usar:

SELECT 1 FROM MyTable WHERE <MyCondition>

Se não houver registro correspondente à condição, o conjunto de registros resultante estará vazio.


Você pode usar:

SELECT COUNT(1) FROM MyTable WHERE ... 

ou

WHERE [NOT] EXISTS 
( SELECT 1 FROM MyTable WHERE ... )

Isso será mais eficiente que o SELECT * já que você está simplesmente selecionando o valor 1 para cada linha, em vez de todos os campos.

Há também uma diferença sutil entre COUNT (*) e COUNT (nome da coluna):

  • COUNT(*) contará todas as linhas, incluindo nulos
  • COUNT(column name) só contará ocorrências não nulas do nome da coluna

SELECT COUNT(1) FROM MyTable WHERE ...

irá percorrer todos os registros. Esta é a razão pela qual é ruim de usar para a existência de registros.

eu usaria

SELECT TOP 1 * FROM MyTable WHERE ...

Depois de encontrar um registro, ele terminará o loop.





query-optimization