Disons que j'ai une mise à jour telle que: 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. P > Comment puis-je suivre jusqu'où dans la table qui a progressé? p> Merci P> Ceci est SQL Server 2008 P> P>
3 Réponses :
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. P>
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. P>
Bien que je soit code> 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 code> (oui c'est vous).
Pas vraiment ... Vous pouvez interroger avec l'indice Nolock et même où, mais cela prendra des ressources p>
Ce n'est pas une requête optimale avec une carte générique principale bien sûr ...) p>
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')
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?)