9
votes

Comment pouvez-vous suivre la progression d'une mise à jour SQL?

Disons que j'ai une mise à jour telle que: xxx

Cette mise à jour va essentiellement passer par des millions de lignes et couper le côlon s'il y en a une dans la colonne C1.

Comment puis-je suivre jusqu'où dans la table qui a progressé?

Merci

Ceci est SQL Server 2008


0 commentaires

3 Réponses :


0
votes

Quères de base de données, en particulier la langue de manipulation de données (DML), sont atomiques. Cela signifie que l'insertion / mise à jour / Supprimer soit surveillé avec succès, ou ce n'est pas le cas. Il n'y a aucun moyen de voir quel enregistrement est traité - à la base de données, ils avaient tous été modifiés une fois que la commission est émise après la mise à jour. Même si vous avez pu voir les enregistrements en cours, au moment où vous verriez la valeur, la requête aura progressé sur d'autres enregistrements.

Le seul moyen de savoir où dans le processus est de script de script de se produire dans une boucle, vous pouvez donc utiliser un compteur pour savoir combien de personnes sont traitées. Il est courant de procéder à ce que de tels ensembles de données importants soient périodiquement engagés, afin de minimiser le risque d'échec nécessitant une nouvelle fois la requête complète.


3 commentaires

Bien que je soit d'accord avec la rompre en morceaux pour des ensembles de données importants, bien que pour une requête respectueuse de l'index, elle peut nécessiter chaque itération de revoir la terre couverte (et aller plus loin dans le tableau)


-1 pour indiquer de manière incorrecte qu'il n'existe "aucun moyen" et à fournir une explication incorrecte. En quelques minutes, ma réponse est votée (oui c'est vous).


Tout le monde est libre de Lire cette question Venir à leurs propres conclusions sur une personne qui admet de descendre d'abord pour tester une réponse. Le fait est que l'activité dans une question le rend visible envers les autres - pas seulement moi. Le temps écoulé ne prouve rien. Peut-être devriez-vous penser à la descente pour obtenir une réaction?



1
votes

Pas vraiment ... Vous pouvez interroger avec l'indice Nolock et même où, mais cela prendra des ressources

Ce n'est pas une requête optimale avec une carte générique principale bien sûr ...)


0 commentaires

22
votes

Vous pouvez utiliser la table Sysindexes, qui garde une trace de combien d'index a changé. Parce que cela se fait dans une mise à jour atomique, il n'aurai aucune chance de recalculer des statistiques, donc Rowmodctr code> continuera à croître. Cela n'est parfois pas perceptible dans de petites tables, mais pour des millions, il montrera.

select rows, rowmodctr
from sysindexes with (nolock)
where id = object_id('testtbl')


2 commentaires

Curieux de votre dernière remarque. Quel est le préjudice dans la mise en marche (NOLOCK) compte sur une table mise à jour?


@Richardhekiwi - Grande réponse. Est-il possible d'utiliser cette méthode sur des tables temporaires? J'aimerais surveiller le progrès de la mise à jour de la table Temp créée dans une autre fenêtre, mais bien sûr, vous ne pouvez pas le voir (peut-être temporairement à l'aide d'une table temporelle de Temp suffirait?)