web-dev-qa-db-fra.com

Masquer Sélectionner la sortie de T-SQL

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 en bas de ma durée, ce 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 purement 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.

13
Gilliam

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

Je ne recommande généralement pas l'insertion dans un #temp table, car toute charge tempdb ou croissance automatique peut avoir un impact sur les résultats, et je ne recommande vraiment pas d'utiliser un @table variable, 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.

NUTS

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 dessus 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 à ce sujet ici .

Explorateur de plans

SentryOne's Plan Explorer est une alternative gratuite pour afficher les plans d'exécution et les blocages avec SQL Server.

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

NUTS

Cela annulera également les résultats.

NUTS

J'espère que cela t'aides!

28
Erik Darling

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.

0
Patrick Hurst

Vous pouvez exécuter votre requête avec SET STATISTICS TIME ON et capturez 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);
}
0
Evandro Muchinski