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$)

11voto

Stefan Zvonar Points 774

Je ne pense pas que quelqu'un l'ait déjà mentionné, mais si vous êtes sûr que les données ne changeront pas sous vos yeux, vous pouvez également appliquer l'indice NoLock pour vous assurer qu'elles ne seront pas bloquées 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

4voto

manish Prasad Points 306

Voici la méthode la plus simple et la plus rapide pour déterminer si un enregistrement existe ou non dans la base de données. La bonne chose est qu'il fonctionne dans toutes les bases de données relationnelles.

SELECT distinct 1 products.id FROM products WHERE products.id = ?;

3voto

Rajper Points 150
SELECT COUNT(*) FROM products WHERE products.id = ?;

Il s'agit de la solution de base de données relationnelle croisée qui fonctionne dans toutes les bases de données.

1voto

Werner Points 393

Pour ceux qui tombent sur ce sujet à partir de MySQL ou d'Oracle, MySQL utilise la clause LIMIT pour sélectionner un nombre limité d'enregistrements, tandis qu'Oracle utilise ROWNUM.

0voto

kiran Points 1
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;

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