Masquer Sélectionner la sortie de T-SQL

13

J'essaie d'obtenir le temps d'exécution de la requête, mais je veux également masquer la sortie de la requête. Je veux juste le temps écoulé - pas de sortie.

Exemple

DECLARE @Start datetime
DECLARE @End datetime

SELECT @StartTimeWA=GETDATE() 

SELECT 
       [id] 
      ,[database_id]
      ,[proc_name]
      ,[exec_t] from
  [DB].[dbo].[STAT] 

SELECT @End=GETDATE()

SELECT DATEDIFF(MS,@Start,@End) AS [Duration]

Pour le moment, j'obtiens une sortie de requête et au fond ma durée, qui est la seule chose que je veux en ce qui concerne la sortie. Je n'ai pas pu le faire et je me demandais si quelqu'un d'autre avait rencontré des problèmes similaires? C'est quelque chose que je veux faire dans T-SQL, pas dans Management Studio ou quelque chose comme ça.

J'essaie de surveiller le temps qu'il faut pour exécuter l'instruction select et faire rapport à un serveur. J'ai un serveur de surveillance externe qui l'exécutera toutes les minutes et récupérera le temps (durée qu'il a fallu) que j'utiliserai au fil du temps pour la tendance / la référence. Comme la requête actuelle crache les résultats sélectionnés et ma durée, elle l'incline et mon serveur de surveillance est confus. Je voulais juste la colonne durée. Je le ferai également pour les inserts, ce qui sera simple car il n'aura pas besoin d'effectuer une sélection.

J'essaie de le faire uniquement en T-SQL . Je ne veux pas utiliser de DMV car je veux obtenir le temps qu'il faut (instantané) lorsque j'exécute une requête et vérifier si cela change au fil du temps lorsque le serveur passe par les différents niveaux de charge car cela me donnera une bonne idée quant à savoir si le temps d'exécution des requêtes change.

Gilliam
la source

Réponses:

28

Il existe de nombreuses façons de procéder.

Je ne recommande généralement pas l'insertion dans une #temptable, car toute charge ou croissance automatique de tempdb peut avoir un impact sur les résultats, et je ne recommande certainement pas d'utiliser une @tablevariable, car les modifications apportées à celles-ci sont forcées en série (aucun plan parallèle ne peut être utilisé), ce qui peut modifier les temps de requête réels.

Affectation variable

Vous pouvez déclarer une variable et lui affecter vos colonnes, comme ceci:

DECLARE @Start datetime
DECLARE @End datetime
DECLARE @blob_eater SQL_VARIANT;

SELECT @StartTimeWA=GETDATE() 

SELECT 
       @blob_eater = [id] 
      ,@blob_eater = [database_id]
      ,@blob_eater = [proc_name]
      ,@blob_eater = [exec_t] from
  [DB].[dbo].[STAT] 

SELECT @End=GETDATE()

SELECT DATEDIFF(MS,@Start,@End) AS [Duration]

Bien que cela puisse empêcher certaines optimisations d'intégration de paramètres. Voir Reniflage de paramètres, incorporation et options RECOMPILE sous "Une restriction d'incorporation".

Notez que cette méthode peut déclencher des avertissements de plan sur les conversions implicites, mais ce n'est pas du genre à vous inquiéter. Voir ce Q & A pour le fond: ce qui déclenche cet avertissement: la conversion de type dans l'expression peut affecter «CardinalityEstimate» dans le choix du plan de requête .

Dans SSMS

Vous pouvez modifier les paramètres pour ignorer les résultats de la requête.

DES NOISETTES

Contrainte de requête SQL

SQL Query Stress est un outil open source qui vous permet d'exécuter des requêtes sur un serveur SQL pour simuler la charge. Aucun résultat de requête n'est renvoyé à l'application lors de son exécution.

Vous pouvez lire quelques instructions à ce sujet ici .

ostress (RML Utilities)

ostress est un outil similaire, publié par Microsoft, qui ne renvoie pas non plus de résultats au client, sauf si vous choisissez de le faire.

J'en ai écrit ici .

Explorateur de plans

SentryOne de plan Explorateur est une alternative libre pour afficher les plans d'exécution SQL Server et Blocages avec.

Vous pouvez également l'utiliser en tant que client pour interroger SQL Serve dans une certaine mesure:

DES NOISETTES

Cela annulera également les résultats.

DES NOISETTES

J'espère que cela t'aides!

Erik Darling
la source
0

Vous pouvez exécuter votre requête avec SET STATISTICS TIME ONet capturer le message de sortie en utilisant votre application de surveillance sur votre serveur de surveillance externe.

Un moyen de capturer le message de sortie avec .Net est expliqué dans cette réponse Stack Overflow par AdaTheDev :

Vous pouvez le faire en ajoutant un gestionnaire d'événements à l' événement InfoMessage sur la connexion.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    myStringBuilderDefinedAsClassVariable.AppendLine(e.Message);
}
Evandro Muchinski
la source
0

Ne pourriez-vous pas simplement utiliser la sélection initiale pour renvoyer votre @End?

SELECT @blob_eater = [id], @ blob_eater = [database_id], @ blob_eater = [proc_name], @ blob_eater = [exec_t] de [DB]. [Dbo]. [STAT]

SELECT @ End = GETDATE ()

Devient

SELECT @ End = GETDATE () FROM [DB]. [Dbo]. [STAT]

Seule la dernière valeur serait stockée dans la variable.

Patrick Hurst
la source