8
votes

Insertion d'une nouvelle inscription de base de données plus rapidement que de vérifier si l'entrée existe en premier?

On m'a dit une fois qu'il est plus rapide de simplement exécuter un insert et de laisser l'insertion échouer que de vérifier si une entrée de base de données existe puis insérant s'il manque.

On m'a également dit que la plupart des bases de données sont fortement optimisées pour la lecture de la lecture plutôt que pour écrire, donc un chèque rapide ne serait pas plus rapide qu'un insert lent?

Est-ce une question du nombre de collisions attendu? (C'est-à-dire qu'il est plus rapide d'insérer uniquement s'il y a une chance faible de l'entrée déjà existante.) Cela dépend-il du type de base de données que je cours? Et à ce sujet, est-ce une mauvaise pratique d'avoir une méthode qui va constamment ajouter des erreurs d'insertion à mon journal d'erreur?

Merci.


0 commentaires

5 Réponses :


8
votes

Si l'insert va échouer à cause d'une violation de l'indice, il sera à la plupart plus légèrement plus lente qu'un chèque que l'enregistrement existe. (Les deux nécessitent de vérifier si l'index contient la valeur.) Si l'insert va réussir, la délivrance de deux requêtes est significativement plus lente que l'émission d'une.


0 commentaires

0
votes

Vous pouvez utiliser insérer Ignorer de sorte que si la clé existe déjà, la commande insertion serait simplement ignorée, sinon la nouvelle ligne sera insérée. De cette façon, vous devez émettre une seule requête, qui vérifie également les valeurs dupliquées également.
Soyez toujours prudent avec l'insertion Ignorer car elle transforme chaque erreur en un avertissement. Lire ce post pour insérer Ignorer
sur la touche en double ignore?


0 commentaires

0
votes

Je pense insérer Ignorer dans .... Peut être utilisé ici, soit il l'insérera ou l'ignorera. Si vous utilisez le mot-clé Ignorer, des erreurs qui se produisent lors de l'exécution de l'instruction insertion sont traitées comme des avertissements à la place. Par exemple, sans ignorer, une ligne qui duplique un indice unique existant ou une valeur de clé primaire dans le tableau provoque une erreur de clé en double et la déclaration est abandonnée. Avec ignorer, la ligne n'est toujours pas insérée, mais aucune erreur n'est émise.


0 commentaires

0
votes

Si vous souhaitez supprimer l'ancienne valeur et insérer une nouvelle valeur, vous pouvez utiliser Remplacez Vous pouvez utiliser Remplacer au lieu d'insérer pour écraser les anciennes lignes.

Remplacez les travaux exactement comme une insertion, sauf si une ligne ancienne du tableau a la même valeur qu'une nouvelle ligne pour une clé primaire ou un indice unique, l'ancienne rangée est supprimée avant que la nouvelle ligne soit insérée.

ailleurs utilisez le Insérer Ignorer car il sera soit inséré ou ignore.

Une ligne qui duplique un indice unique existant ou une valeur de clé primaire dans le tableau provoque une erreur de clé en double et la déclaration est abandonnée. Avec ignorer, la ligne n'est toujours pas insérée, mais aucune erreur n'est émise.


0 commentaires

0
votes

Si votre intention est d'insérer si c'est un nouvel enregistrement ou mettez à jour le dossier s'il existe déjà alors que diriez-vous de faire une upersert?

Départ - http: / /vadivel.blogspot.com/2011/09/UPSERTER-INSERT-AND-UPDATE-IN-SQL-SERVER.HTML

au lieu de vérifier si l'enregistrement existe ou non, nous pouvons essayer de le mettre à jour directement. S'il n'y a pas d'enregistrement correspondant, alors @@ RowCount serait 0. Sur la base de celle-ci, nous pouvons l'insérer comme un nouvel enregistrement. [Dans SQL Server 2008, vous pouvez utiliser le concept de fusion pour cela]

Edit: Veuillez noter que cela fonctionne que cela fonctionne pour MS SQL Server et je ne sais pas sur MySQL ou Oracle


0 commentaires