Comme le titre l'indique ... j'essaie de trouver le moyen le plus rapide avec le moins de frais généraux pour déterminer si un enregistrement existe dans une table ou non.
Exemple de requête:
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 = ?;
Disons que le ?
est échangé avec 'TB100'
... les première et deuxième requêtes renverront exactement le même résultat (disons ... 1
pour cette conversation). La dernière requête retournera 'TB100'
comme prévu, ou rien si le id
n'est pas présent dans la table.
Le but est de savoir si le id
est dans le tableau ou non. Sinon, le programme insérera ensuite l'enregistrement, si tel est le cas, le programme l'ignorera ou effectuera une requête UPDATE basée sur une autre logique de programme en dehors du champ d'application de cette question.
Lequel est le plus rapide et a moins de frais généraux? (Cela sera répété des dizaines de milliers de fois par exécution de programme et sera exécuté plusieurs fois par jour).
(Exécution de cette requête sur M $ SQL Server à partir de Java via le pilote JDBC fourni par M $)
la source
if exists(select null from products where id = @id)
; si dans une requête appelée directement par un clientselect case when exists (...) then 1 else 0 end
.Réponses:
SELECT TOP 1 products.id FROM products WHERE products.id = ?;
dépassera toutes vos suggestions car il mettra fin à l'exécution après avoir trouvé le premier enregistrement.la source
id
n'est pas PK. Donc +1 à votre avis.EXISTS
(ouNOT EXISTS
) est spécialement conçu pour vérifier si quelque chose existe et devrait donc être (et est) la meilleure option. Il s'arrêtera sur la première ligne qui correspond, donc il ne nécessite pas deTOP
clause et il ne sélectionne en fait aucune donnée donc il n'y a pas de surcharge en taille des colonnes. Vous pouvez utiliser en toute sécuritéSELECT *
ici - pas différent deSELECT 1
,SELECT NULL
ouSELECT AnyColumn
... (vous pouvez même utiliser une expression invalide commeSELECT 1/0
et elle ne cassera pas) .la source
Exists
fonctionne avecselect
de telle manière qu'il se termine dès qu'une ligne est trouvée. De plus, il existe simplement des notes sur l'existence d'un enregistrement, pas de valeurs réelles dans l'enregistrement, ce qui évite de charger la ligne à partir du disque (en supposant que les critères de recherche sont indexés, bien sûr). En ce qui concerne les frais généraux deif
- vous devrez de toute façon passer ce temps minuscule.select top
ouexists
; s'ils ne sont pas présents, le moteur SQL devra effectuer une analyse de table. C'est l'option de recherche de table la moins souhaitable. Si vous n'êtes pas autorisé à créer des index, vous devrez communiquer avec le personnel technique de l'autre côté pour savoir s'ils les ajustent automatiquement ou s'ils s'attendent à ce que vous suggériez des index.SELECT CASE WHEN EXISTS(..) THEN 1 ELSE 0 END;
Rien ne peut battre -
Vous n'avez pas besoin de compter pour savoir s'il y a des données dans le tableau. Et n'utilisez pas d'alias lorsque cela n'est pas nécessaire.
la source
id
n'est pas la clé primaire. Donc, même si vous n'êtes pas comptiez vous avez encore besoin de trouver tous les documents correspondants, peut - être des milliers d'entre eux. À propos de l'aliasing - le code est un travail constant en cours. Vous ne savez jamais quand vous devrez rentrer. Le crénelage permet d'éviter les erreurs d'exécution stupides; par exemple, un nom de colonne unique qui n'avait pas besoin d'alias n'est plus unique car quelqu'un a créé une colonne du même nom dans une autre table jointe.aliasing
. Le terme correct estqualifying
. Voici une explication plus longue d'Alex Kuznetzov . À propos des requêtes de table unique - il s'agit désormais d'une table unique . Mais plus tard, lorsque le bogue est découvert et que vous essayez de contenir l'inondation, le client est nerveux, vous rejoignez une autre table juste pour faire face au message d'erreur - message facilement corrigible, mais pas à ce moment de transpiration, un petit coup frappe - et vous corrigez le erreur de ne jamais quitter une colonne ...Cette approche renvoie un booléen pour vous.
la source
Vous pouvez aussi utiliser
la source
Ne pensez pas que quiconque l'a encore mentionné, mais si vous êtes sûr que les données ne changeront pas en dessous de vous, vous pouvez également appliquer l'indice NoLock pour vous assurer qu'il n'est pas bloqué lors de la lecture.
la source
Il s'agit de la solution de base de données relationnelle croisée qui fonctionne dans toutes les bases de données.
la source
Vous trouverez ci-dessous le moyen le plus simple et le plus rapide de déterminer si un enregistrement existe ou non dans la base de données.La bonne chose est que cela fonctionne dans toutes les bases de données relationnelles
la source
la source
Je l'ai utilisé dans le passé et il ne nécessite pas une analyse complète de la table pour voir si quelque chose existe. C'est super rapide ...
la source
Pour ceux qui découvrent cela à partir de MySQL ou d'Oracle background - MySQL prend en charge la clause LIMIT pour sélectionner un nombre limité d'enregistrements, tandis qu'Oracle utilise ROWNUM.
la source