188 votes

Le moyen le plus rapide de déterminer si un enregistrement existe

Comme le titre le suggère... J'essaie de trouver le moyen le plus rapide et le moins coûteux de déterminer si un enregistrement existe ou non dans une table.

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 = ?;

Dites le ? est échangé avec 'TB100' ... la première et la seconde requête renverront exactement le même résultat (disons... 1 pour cette conversation). La dernière requête renverra 'TB100' comme prévu, ou rien si le id n'est pas présent dans le tableau.

Le but est de déterminer si le id est dans le tableau ou non. Si ce n'est pas le cas, le programme insère l'enregistrement. S'il l'est, le programme l'ignore ou exécute une requête UPDATE en fonction d'une autre logique de programme qui n'entre pas dans le cadre de cette question.

Lequel est le plus rapide et présente le moins de frais généraux ? (Cette question sera répétée des dizaines de milliers de fois par exécution du programme, et sera exécutée plusieurs fois par jour).

(Exécution de cette requête contre le serveur SQL de M$ à partir de Java via le pilote JDBC fourni par M$)

242voto

Nenad Zivkovic Points 14392

EXISTS (ou NOT EXISTS ) est spécialement conçu pour vérifier si quelque chose existe et devrait donc être (et est) la meilleure option. Elle s'arrêtera sur la première ligne qui correspond, et ne nécessite donc pas un paramètre TOP et elle ne sélectionne pas réellement de données, ce qui évite de surcharger la taille des colonnes. Vous pouvez utiliser en toute sécurité SELECT * ici - pas différent de SELECT 1 , SELECT NULL o SELECT AnyColumn ... (vous pouvez même utiliser une expression invalide comme SELECT 1/0 et il ne se brisera pas) .

IF EXISTS (SELECT * FROM Products WHERE id = ?)
BEGIN
--do what you need if exists
END
ELSE
BEGIN
--do what needs to be done if not
END

200voto

Declan_K Points 3689

SELECT TOP 1 products.id FROM products WHERE products.id = ?; sera plus performant que toutes vos suggestions car il terminera l'exécution après avoir trouvé le premier enregistrement.

26voto

AgentSQL Points 2620

Rien ne peut battre -

SELECT TOP 1 1 FROM products WHERE id = 'some value';

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 quand ce n'est pas nécessaire.

17voto

Kris Coleman Points 366
SELECT CASE WHEN EXISTS (SELECT TOP 1 *
                         FROM dbo.[YourTable] 
                         WHERE [YourColumn] = [YourValue]) 
            THEN CAST (1 AS BIT) 
            ELSE CAST (0 AS BIT) END

Cette approche vous renvoie un booléen.

11voto

atik sarker Points 198

Vous pouvez également utiliser

 If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
    BEGIN
         --<Do something>
    END 

ELSE    
     BEGIN
       --<Do something>
     END

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X