Comment pouvez-vous suivre la progression d'un SQL de mise à jour?
Disons que j'ai une mise à jour telles que:
UPDATE [db1].[sc1].[tb1]
SET c1 = LEFT(c1, LEN(c1)-1)
WHERE c1 like '%:'
Cette mise à jour est fondamentalement va passer par des millions de lignes et de couper le colon si il y en a un dans la colonne c1.
Comment puis-je suivre l'évolution dans le tableau du présent a progressé?
Grâce
C'est sql server 2008
OriginalL'auteur Matt | 2011-01-21
Vous devez vous connecter pour publier un commentaire.
Requêtes de base de données, en particulier Langage de Manipulation de Données (DML), sont atomiques. Cela signifie que les INSERT/UPDATE/DELETE avec succès se produit, ou il ne l'est pas. Il n'y a aucun moyen de voir ce dossier est en cours de traitement -- à la base de données, ils avaient tous été changés une fois le COMMIT est délivré après la mise à JOUR. Même si vous avez été en mesure d'afficher les dossiers en cours, par le temps, vous pouvez voir la valeur, la requête a progressé sur d'autres dossiers.
Le seul moyen de savoir où dans le processus de script de la requête à se produire à l'intérieur d'une boucle, de sorte que vous pouvez utiliser un compteur pour savoir combien sont traitées. Il est courant pour ce faire, de grands ensembles de données sont régulièrement commis, afin de minimiser le risque de défaillance nécessitant d'avoir à exécuter l'intégralité de la requête une fois de plus.
do
d'accord avec le casser en morceaux d'importants ensembles de données, bien que pour un non-index amicale de la requête, il peut exiger que chaque itération de revisiter le sol couvert (pour aller plus loin dans la table)-1 pour avoir déclaré, à tort, qu'il n'y a "aucun moyen" et de fournir d'explication incorrecte.
Within minutes, my answer gets voted down
(oui, c'est vous).Chacun est libre de lisez cette question pour venir à leurs propres conclusions au sujet de quelqu'un qui avoue downvoting premier à tester une réponse. Le fait est, l'activité en question rend visible pour les autres, pas juste moi. Le temps écoulé ne prouve rien. Peut-être vous devriez penser à downvoting dans le but d'obtenir une réaction?
OriginalL'auteur OMG Ponies
Vous pouvez utiliser la table sysindexes, qui garde la trace de combien un index a changé. Parce que ceci est fait dans un atomique de mise à jour, il n'aura pas une chance pour le recalcul des statistiques, de sorte
rowmodctr
va continuer de croître. Ce n'est parfois pas sensible à de petites tables, mais pour des millions, il va le montrer.Maintenant dans une autre fenêtre de requête, exécutez la ci-dessous en permanence et de regarder le rowmodctr va up et up.
rowmodctr
vsrows
vous donne une idée de l'endroit où vous êtes, si vous savez oùrowmodctr
besoins à la fin. Dans notre cas, il est de 67% de plus de 2 millions de dollars.Merci de ne pas exécuter (nolock) le nombre de requêtes sur la table
itself
alors qu'il est en train d'être mis à jour.Grande réponse. Est-il possible d'utiliser cette méthode sur des tables temporaires? J'aimerais suivre la progression de mise à jour de la table temporaire créée dans une autre fenêtre, mais, bien sûr, ne peut pas le voir (peut-être temporairement à l'aide d'un mondial de la table temporaire suffirait?)
OriginalL'auteur RichardTheKiwi
Pas vraiment... vous pouvez faire une requête avec l'indication nolock et même où, mais cela va prendre des ressources
Ce n'est pas une requête optimal avec un générique bien sûr...)
OriginalL'auteur gbn