2009-08-19 4 views
0

Pour une certaine logique métier, une séquence peut être soit deux mises à jour distinctes, soit une suppression suivie d'une insertion. Fondamentalement, la mise à jour annulerait une colonne afin que je puisse la faire ressembler à une suppression. Je ne suis pas concerné par la perte de lignes (une simple suppression n'est donc pas nécessaire): quelle est l'approche la plus efficace?quoi de plus coûteux, 2 mises à jour, ou une suppression et un insert?

+3

La plupart des bases de données ont des options ("expliquer" par exemple) qui détaillent le travail à effectuer pour satisfaire une certaine requête et le coût. Avez-vous essayé d'utiliser cela sur votre SGBDR cible? – Promit

+0

je vais essayer ça ... merci –

Répondre

0

Cela dépend énormément de la nature des requêtes. Peut-être que vos deux mises à jour peuvent être écrites en tant que jointure de mise à jour et être plus rapides qu'une suppression et insertion. Si vous avez des indices sur votre table, la suppression et l'insertion seront beaucoup plus coûteux. Si c'est une colonne de longueur variable, peut-être que la suppression et l'insertion sont plus rapides.

Il y a beaucoup de facteurs qui entrent en ligne de compte. Le meilleur moyen est de l'évaluer et d'utiliser explain pour savoir ce que fait exactement la base de données avec chacune de vos requêtes.

0

Il semble que, du point de vue de l'intégrité des données, il vaudrait mieux que vous supprimiez et que vous insériez.

Et supprimer des données dont vous n'avez pas besoin est nettement moins coûteux que de les conserver.

En termes de vitesse réelle, je dirais que c'est négligeable, sauf si le profilage prouve le contraire.

1

Benchmark les. N'oubliez pas de comparer d'autres requêtes sur la ou les tables.

Mieux encore, choisissez celui qui mène au modèle de données le plus sensible.

1

Meilleur pour mesurer, mais il aide à comprendre ce qui se passe au niveau du disque. Voici ce qui se passe conceptuellement:

Si les mises à jour concernent des colonnes qui ne sont pas dans un index, les mises à jour peuvent être effectuées "en place" dans une seule écriture sauf si l'enregistrement augmente (ce qui, si vous supprimez un champ, est peu probable). Si les colonnes sont indexées, il y aura des écritures dans ces index pour supprimer les anciennes valeurs et ajouter les nouvelles.

Lorsque vous supprimez, il y aura une écriture pour supprimer la clé primaire de l'enregistrement de suppression de son index et écrit pour supprimer toutes les clés secondaires des index secondaires. Lorsque vous insérez, il y a des écritures pour l'enregistrement que vous ajoutez, une ou plusieurs écritures pour obtenir la clé primaire dans un index (les pages d'index peuvent se diviser, nécessitant plusieurs écritures) et les écritures pour obtenir des informations secondaires. clés dans leurs index.