Estimation de la durée de la requête dans SQL Server
-
03-07-2019 - |
Question
J'ai vu dans Oracle 10g une fonctionnalité qui estime le temps restant pour une requête longue et je me demandais si cela était possible aussi avec SQL Server (au moins en 2008?)?
Supposons que j'ai un très grand tableau avec des dizaines de millions de lignes (bien indexé, etc.) et que je dois rechercher des lignes particulières. Je sais que cela prendra beaucoup de temps et je suis cool avec cela, mais je voudrais présenter à l'utilisateur une sorte de barre de progression.
Comment puis-je afficher les progrès?
La solution
Je l'oublierais et je mettrais un cercle en rotation!
Sérieusement, pour aller plus loin dans l’idée de MrTelly, il existe des vues de gestion dynamiques qui peuvent vous donner des temps d’exécution moyens pour certaines requêtes - peut-être que cela vous mènera quelque part.
http://msdn.microsoft.com/en-us/library /ms188754.aspx
modifier: J'ai vu le pourcentage terminé dans la procédure sp_whoisactive d'Adam Machanic. Peut-être que c'est un autre endroit à examiner. SQL 2016 a le magasin de requêtes qui conserve les informations de cache de plan, un substitut du cache de plan dmv, qui est effacé au redémarrage.
Autres conseils
Connexes:
Les systèmes de base de données d’aujourd’hui fournissent peu d’informations à l’utilisateur / au DBA sur le niveau d'exécution d'une requête SQL est terminé. Pour longtemps requêtes, de tels commentaires peuvent être très utiles, par exemple, pour aide à décider si la requête doit être terminée ou autorisée à s'exécuter À l'achèvement. Bien que l’exigence ci-dessus soit facile à exprimer, développer un indicateur robuste de progression pour l'exécution des requêtes est difficile. Dans cet article, nous étudions le problème ci-dessus et présentons techniques qui peuvent constituer la base d’une estimation efficace des progrès. Les résultats de la validation expérimentale de nos techniques sous Microsoft SQL Server est prometteur.
Je ne connais pas d'outil qui le fasse automatiquement, mais il existe plusieurs solutions. Divisez votre requête en blocs ...
select blah from table where IdRange between (1 and 100000)
select blah from table where IdRange between (100001 and 200000)
à la fin de chaque sql, mettez à jour la barre de progression.
Vous pouvez également enregistrer la durée nécessaire à chacune de vos sélections et stocker ces valeurs, utilisateur par utilisateur. Utilisez ensuite ces informations pour renvoyer une longueur de barre de progression.
Ces deux approches sont plutôt calmes, espérons que quelqu'un connaisse une meilleure approche.
Vous pouvez bien sûr essayer de déchiffrer le plan de requête et émettre un jugement en fonction de cela, mais dans le code, ce serait difficile.