Le coût des Insertions vs mise à Jour de SQL Server
J'ai une table avec plus d'un millon de lignes. Ce tableau est utilisé pour indexer tiff
images. Chaque image a des domaines comme la date
, number
, etc. J'ai les utilisateurs que l'indice de ces images par lots de 500. J'ai besoin de savoir si il est préférable de d'abord insérer 500 lignes et ensuite effectuer 500 mises à jour ou, lorsque l'utilisateur a terminé l'indexation, pour faire les 500 insère avec toutes les données. Une chose très importante est que si je ne l'500 insère au premier abord, ce temps est libre pour moi parce que je peux le faire la veille au soir.
La question est donc: est-il préférable d'effectuer des insertions ou des insertions et mises à jour, et pourquoi? J'ai défini un id
valeur pour chaque image, et j'ai aussi d'autres indices sur les champs.
Vous devez vous connecter pour publier un commentaire.
Mises à jour de Sql server résultat en fantôme lignes - c'est à dire Sql traverse une ligne et met une nouvelle dans. Le barré ligne est supprimée par la suite.
Les deux insertions et mises à jour peuvent causer de la page se divise en de cette façon, ils ont tous les deux effectivement "ajouter" des données, c'est juste que les mises à jour du drapeau les vieux trucs d'abord.
Sur le dessus de cette mise à jour doit rechercher la ligne en premier, ce qui pour un grand nombre de données peut prendre plus de temps que la mise à jour.
Insère sera à peu près toujours être plus rapide, surtout si ils sont soit dans l'ordre ou si la table sous-jacente n'a pas d'index cluster.
Lors de l'insertion de grandes quantités de données dans une table de regarder le les indices actuels - qu'ils peuvent prendre un certain temps pour changer et construire. L'ajout de valeurs dans le milieu d'un index est toujours plus lente.
Vous pouvez penser à elle comme l'ajout à un carnet d'adresses: M. Z peut simplement être ajouté à la dernière page, tandis que vous aurez à trouver un espace au milieu pour m. M.
Faire les inserts en premier, puis les mises à jour ne semble pas être une meilleure idée pour plusieurs raisons. Vous serez en insérant dans une période de faible volume de transactions. Depuis insère avoir plus de données, c'est le meilleur moment pour le faire.
Puisque vous êtes en utilisant une valeur d'id (ce qui est probablement indexés) pour les mises à jour, les frais généraux de mises à jour sera très faible. Vous devez également avoir moins de données lors de vos mises à jour.
Vous pouvez également désactiver les transactions sur le lot (500 insertions/mises à jour), et l'utiliser pour chaque enregistrement individuel, ce qui permettra de réduire les frais généraux.
Enfin, un test pour voir le rendement réel sur votre serveur avant de prendre une décision finale.
Je ne suis pas une base de données gars, mais j'imagine faire les inserts en un seul coup serait plus rapide car les mises à jour nécessitent une recherche alors que les inserts ne sont pas.
Le plan d'exécution de chaque requête va vous dire lequel doit être plus cher. Le vrai facteur limitant sera écrit sur le disque, de sorte que vous pouvez avoir besoin pour exécuter certains tests lors de l'exécution de l'analyseur de performances pour voir les requêtes qui provoque plus de l'écrit et les causes de la file d'attente du disque d'obtenir la plus longue (plus mauvais).
Ce n'est pas un coupé et sec question. Krishna et Galegian les points sont sur place.
Pour les mises à jour, l'impact sera moindre si les mises à jour sont touchant des champs de longueur fixe. Si la mise à jour de type varchar ou les champs blob, vous pouvez ajouter un coût de fractionnements de page lors de la mise à jour lorsque la nouvelle valeur dépasse la longueur de l'ancienne valeur.
Je pense que les inserts de courir plus vite. Ils ne nécessitent pas de recherche (lorsque vous effectuez une mise à jour, vous êtes essentiellement faire l'équivalent d'un select avec la clause where). Et aussi, une insertion de ne pas verrouiller les lignes de la manière dont une mise à jour, de sorte qu'il n'interfère pas avec tout sélectionne que sont en train d'arriver sur la table en même temps.