Como o título sugere ... Estou tentando descobrir o caminho mais rápido com o mínimo de sobrecarga para determinar se um registro existe em uma tabela ou não.
Consulta de amostra:
SELECT COUNT(*) FROM products WHERE products.id = ?;
vs
SELECT COUNT(products.id) FROM products WHERE products.id = ?;
vs
SELECT products.id FROM products WHERE products.id = ?;
Digamos que ?
seja trocado por 'TB100'
... a primeira e a segunda consultas retornarão exatamente o mesmo resultado (digamos ... 1
para esta conversa). A última consulta retornará 'TB100'
conforme o esperado ou nada se id
não estiver presente na tabela.
O objetivo é descobrir se o item id
está na tabela ou não. Caso contrário, o programa inserirá o registro em seguida, caso contrário, o programa o ignorará ou executará uma consulta UPDATE com base em outra lógica do programa fora do escopo desta pergunta.
Qual é mais rápido e tem menos despesas gerais? (Isso será repetido dezenas de milhares de vezes por execução do programa e será executado várias vezes ao dia).
(Executando esta consulta no M $ SQL Server a partir de Java por meio do driver JDBC fornecido pelo M $)
fonte
if exists(select null from products where id = @id)
; se em uma consulta chamada diretamente por um clienteselect case when exists (...) then 1 else 0 end
.Respostas:
SELECT TOP 1 products.id FROM products WHERE products.id = ?;
superará todas as suas sugestões, pois encerrará a execução após encontrar o primeiro registro.fonte
id
não é PK. Então, marque com +1 seu conselho.EXISTS
(ouNOT EXISTS
) foi projetado especialmente para verificar se algo existe e, portanto, deve ser (e é) a melhor opção. Ele será interrompido na primeira linha que corresponder, para que não exija umaTOP
cláusula e, na verdade, não selecione nenhum dado para que não haja sobrecarga no tamanho das colunas. Você pode usar com segurançaSELECT *
aqui - não é diferente deSELECT 1
,SELECT NULL
ouSELECT AnyColumn
... (você pode até usar uma expressão inválida comoSELECT 1/0
essa e ela não será quebrada) .fonte
Exists
trabalha deselect
tal maneira que sai assim que uma linha é encontrada. Além disso, existe apenas uma anotação da existência do registro, e não valores reais no registro, economizando a necessidade de carregar a linha do disco (assumindo que os critérios de pesquisa sejam indexados, é claro). Quanto às despesas geraisif
- você terá que gastar esse tempo minúsculo de qualquer maneira.select top
ouexists
; se eles não estiverem presentes, o mecanismo sql terá que executar a verificação da tabela. Esta é a opção de pesquisa de tabela menos desejável. Se você não está autorizado a criar índices, precisará se comunicar com a equipe técnica do outro lado para descobrir se eles os ajustam automaticamente ou se espera que você sugira índices.SELECT CASE WHEN EXISTS(..) THEN 1 ELSE 0 END;
Nada pode vencer -
Você não precisa contar para saber se há dados na tabela. E não use alias quando não for necessário.
fonte
id
não é chave primária. Portanto, mesmo que você não esteja contando, ainda precisa encontrar todos os registros correspondentes, possivelmente milhares deles. Sobre o aliasing - o código é um trabalho constante em andamento. Você nunca sabe quando precisará voltar. O alias ajuda a evitar erros estúpidos de tempo de execução; por exemplo, o nome exclusivo da coluna que não precisava de um alias não é mais exclusivo porque alguém criou uma coluna com o mesmo nome em outra tabela unida.aliasing
. O termo correto équalifying
. Aqui está uma explicação mais longa de Alex Kuznetzov . Sobre consultas de mesa única - é única tabela agora . Porém, mais tarde, quando o bug é descoberto e você está tentando conter o fluxo, o cliente está nervoso, você se junta a outra tabela apenas para enfrentar a mensagem de erro - mensagem facilmente corrigível, mas não nesse momento suado, um pequeno golpe - e você corrige o erro lembrando a nunca deixar uma coluna ...Essa abordagem retorna um valor booleano para você.
fonte
Você também pode usar
fonte
Não pense que alguém já o tenha mencionado, mas se tiver certeza de que os dados não serão alterados, você também pode aplicar a dica NoLock para garantir que não seja bloqueada durante a leitura.
fonte
Esta é a solução de banco de dados relacional cruzado que funciona em todos os bancos de dados.
fonte
Abaixo está a maneira mais simples e rápida de determinar se um registro existe ou não no banco de dados. Ainda bem que funciona em todos os bancos de dados relacionais
fonte
fonte
Eu usei isso no passado e não requer uma verificação completa da tabela para ver se existe algo. É super rápido ...
fonte
Para aqueles que se deparam com isso a partir do MySQL ou do Oracle background - o MySQL suporta a cláusula LIMIT para selecionar um número limitado de registros, enquanto o Oracle usa o ROWNUM.
fonte