2011-07-05 5 views
0

J'ai une table avec 1 colonne et je veux vérifier la répétition d'une valeur entre 10 000 lignes disponibles.Lequel est le plus rapide pour trouver des répétitions?

Je crois avoir deux choix:

faire une requête en utilisant la déclaration SELECT, comme ceci:

Var = Query('SELECT * FROM Table WHERE 
Field1="VALUE"'); 

if (Var <> null) 
    MessageBox("This value exists in the table"); 

Définir ma colonne comme Primary Key et l'utilisation déclaration INSERT, comme celui-ci:

try { 
    Var = Query('INSERT INTO Table(Field1) VALUES("VALUE")'); 
} 
catch { 
    MessageBox("This value exists in the table"); 
} 

Lequel est le plus rapide?

+0

Voulez-vous * insérer * une nouvelle ligne, ou simplement vérifier la présence d'une nouvelle ligne? Sûrement c'est la chose la plus importante - que voulez-vous que l'état de la table soit après? –

Répondre

1

Il n'y a pas de réponse générale ici, cela dépend de la façon dont votre schéma est mis en place. Dans la plupart des bases de données relationnelles (peut-être toutes?), La création d'un champ Primary Key crée automatiquement un index sur ce champ. Et faire le contrôle d'unicité sur un index est à peu près aussi rapide que vous pouvez l'obtenir dans ce cas. Mais, vous pouvez indexer votre champ sans le déclarer comme Primary Key de votre table. Et si vous le faites, la commande SELECT sera aussi rapide que la méthode de capture INSERT. Plus généralement, vous ne pouvez avoir qu'un Primary Key par table, ce qui rend le champ Primary Key n'est pas une solution très robuste. Il se casse dès que vous avez plusieurs champs sur lesquels vous voulez appliquer l'unicité (à moins que vous ne fassiez une clé primaire composée dans les deux champs ... mais je digresse, et cela n'impose pas l'unicité de chaque colonne).

Je vous recommande donc de créer un index sur votre champ/colonne, puis d'utiliser la méthode SELECT pour voir si la valeur existe déjà. Alternativement, vous pouvez indexer le champ et stipuler qu'il doit être unique, sans ce qui en fait votre Primary Key, et utiliser l'approche de capture plus INSERT.

1

Je vous recommande d'utiliser select count:

Var = Query('SELECT count(*) FROM Table WHERE Field1="VALUE"'); 

if (Var > 0) MessageBox("This value exists in the table"); 

La seconde méthode est si gentil, l'OMI, et il va probablement être beaucoup plus lent. Et BTW, il faut lire existe au lieu de existe :-)

1

Si vous voulez insérer une valeur, si elle n'existe pas, alors quelque chose comme ce qui suit serait le plus approprié (bien que différents dialectes SQL peuvent appliquer):

INSERT INTO Table(Column) 
SELECT 'New Value' WHERE NOT EXISTS (SELECT * FROM Table where Column = 'New Value') 

Et puis vérifier si 0 ou 1 lignes ont été affectées.

Notez où je dis le plus approprié, je ne fais pas une évaluation de performance. Je parle du code qui exprime le plus clairement le intention. Habituellement, ce sera assez bon. Ne devriez rarement vous éloigner du code qui exprime le plus clairement votre intention, quelque chose moins clair qui réalise 0,5% de mieux ...


Vous devez également prendre garde votre premier format (SELECT * FROM TABLE...), en tant que style général .Si vous interrogez une table large et large, l'exécution d'une telle sélection peut entraîner l'exécution d'un grand nombre d'E/S par la base de données, afin d'extraire toutes les valeurs de colonne, juste pour que votre code ignore toutes ces valeurs. D'autre part, la clause SELECT *... d'une clause EXISTS est spécialement traitée par la plupart des moteurs de base de données et ne récupère pas les données réelles de ligne/colonne.

+0

Merci, mais comme je l'ai dit «J'ai une table avec 1 colonne». Donc, il n'y a pas de problème à utiliser 'SELECT ALL' – Kermia

+1

@Kermia - la deuxième partie de ma réponse était d'essayer de le mettre en garde contre un style général, pas spécifique à cette situation. Le reste de ma réponse s'applique toujours, je pense. –

Questions connexes