web-dev-qa-db-fra.com

Moyen le plus rapide de déterminer si un enregistrement existe

Comme le titre l'indique ... J'essaie de trouver le moyen le plus rapide avec le moins de temps système pour déterminer si un enregistrement existe ou non dans un tableau. 

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

Supposons que le ? soit échangé avec le 'TB100'... La première et la deuxième requête renvoient exactement le même résultat (disons ... 1 pour cette conversation). La dernière requête retournera 'TB100' comme prévu, ou rien si la id n'est pas présente dans la table. 

Le but est de déterminer si la id est dans la table ou non. Si ce n'est pas le cas, le programme insérera ensuite l'enregistrement, si c'est le cas, il l'ignorera ou exécutera une requête UPDATE basée sur une autre logique de programme en dehors du champ de cette question.

Lequel est plus rapide et a moins de frais généraux? (Cela sera répété des dizaines de milliers de fois par 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 $)

111
SnakeDoc

SELECT TOP 1 products.id FROM products WHERE products.id = ?; surperformera toutes vos suggestions, car il mettra fin à l'exécution après la découverte du premier enregistrement.

140
Declan_K

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, de sorte qu’elle ne nécessite pas de clause TOP et qu’elle ne sélectionne aucune donnée. Il n’ya donc pas de surcharge de la taille des colonnes. Vous pouvez utiliser en toute sécurité SELECT * ici - pas différent de SELECT 1, SELECT NULL ou SELECT AnyColumn... (vous pouvez même utiliser une expression non valide comme SELECT 1/0 et elle ne se cassera 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
153
Nenad Zivkovic

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 existe une donnée dans la table. Et n'utilisez pas d'alias quand ce n'est pas nécessaire. 

17
AgentSQL
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 renvoie un booléen pour vous.

10
Kris Coleman

Vous pouvez aussi utiliser

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

ELSE    
     BEGIN
       --<Do something>
     END
7
atik sarker

Ne pensez pas que quiconque l'ait déjà mentionné, mais si vous êtes certain que les données ne changeront pas sous vous, vous pouvez également appliquer l'indicateur NoLock pour vous assurer qu'il n'est pas bloqué lors de la lecture.

SELECT CASE WHEN EXISTS (SELECT 1 
                     FROM dbo.[YourTable] WITH (NOLOCK)
                     WHERE [YourColumn] = [YourValue]) 
        THEN CAST (1 AS BIT) 
        ELSE CAST (0 AS BIT) END
4
Stefan Zvonar

Voici le moyen le plus simple et le plus rapide de déterminer si un enregistrement existe ou non dans la base de données.

SELECT distinct 1 products.id FROM products WHERE products.id = ?;
2
manish Prasad
SELECT COUNT(*) FROM products WHERE products.id = ?;

Ceci est la solution de base de données relationnelle qui fonctionne dans toutes les bases de données. 

2
Muhammad Aslam

Je l'ai déjà utilisé par le passé et n'exige pas une analyse complète de la table pour voir si quelque chose existe C'est super rapide ...

UPDATE TableName SET column=value WHERE column=value
IF @@ROWCOUNT=0
BEGIN
     --Do work
END             
0
Eric Parsons

Pour ceux qui ont des difficultés avec MySQL ou Oracle, MySQL supporte la clause LIMIT pour sélectionner un nombre limité d'enregistrements, tandis qu'Oracle utilise ROWNUM.

0
Werner
create or replace procedure ex(j in number) as
i number;
begin
select id into i from student where id=j;
if i is not null then
dbms_output.put_line('exists');
end if;
exception
   when no_data_found then
        dbms_output.put_line(i||' does not exists');

end;
0
kiran