Select-Ausgabe von T-SQL ausblenden

13

Ich versuche, die Ausführungszeit für Abfragen zu ermitteln, möchte aber auch die Abfrageausgabe ausblenden. Ich möchte nur die verstrichene Zeit - keine Ausgabe.

Beispiel

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]

Im Moment erhalte ich eine Abfrage-Ausgabe und im Grunde meine Dauer, was das Einzige ist, was ich will, was die Ausgabe betrifft. Ich habe das nicht geschafft und mich gefragt, ob noch jemand auf ähnliche Probleme gestoßen ist? Dies ist etwas, was ich in T-SQL tun möchte, nicht in Management Studio oder Ähnlichem.

Ich versuche zu überwachen, wie lange es dauert, die select-Anweisung auszuführen und einen Bericht an einen Server zu senden. Ich habe einen externen Monitorserver, der das jede Minute ausführt und die Zeit zurückbekommt (Dauer, die es dauerte), die ich im Laufe der Zeit zum Trend / zur Grundlinie verwenden werde. Während die aktuelle Abfrage die ausgewählten Ergebnisse und meine Dauer ausspuckt, wird sie verzerrt und mein Monitorserver wird verwirrt. Ich wollte nur die Dauer Spalte. Ich werde dies auch für Einfügungen tun, was unkompliziert ist, da keine Auswahl durchgeführt werden muss.

Ich versuche das rein in T-SQL zu machen . Ich möchte keine DMVs verwenden, da ich die benötigte Zeit (Momentaufnahme) für die Ausführung einer Abfrage abrufen und prüfen möchte, ob sich diese Zeit ändert, wenn der Server die verschiedenen Laststufen durchläuft, da dies eine gute Idee ist ob sich die Ausführungszeit der Abfrage ändert.

Gilliam
quelle

Antworten:

28

Es gibt viele verschiedene Möglichkeiten, dies zu tun.

Normalerweise empfehle ich das Einfügen in eine #tempTabelle nicht, da sich Tempdb-Last oder Autogrowth auf die Ergebnisse auswirken können, und ich empfehle definitiv nicht, eine @tableVariable zu verwenden, da Änderungen an diesen seriell erzwungen werden (es kann kein paralleler Plan verwendet werden) kann die tatsächlichen Abfragezeiten ändern.

Variablenzuordnung

Sie können eine Variable deklarieren und ihre Spalten wie folgt zuweisen:

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]

Dies kann jedoch einige Optimierungen beim Einbetten von Parametern verhindern. Siehe Parameter-Sniffing, Einbettung und die RECOMPILE-Optionen unter "Eine Einbettungsbeschränkung".

Beachten Sie, dass diese Methode möglicherweise Planwarnungen über implizite Konvertierungen auslöst, Sie sich jedoch keine Sorgen machen müssen. Hintergrundinformationen finden Sie in den folgenden Fragen und Antworten: Auslöser dieser Warnung: Die Typkonvertierung in Expression kann sich auf "CardinalityEstimate" in der Abfrageplanauswahl auswirken .

In SSMS

Sie können die Einstellungen ändern, um die Abfrageergebnisse zu verwerfen.

NÜSSE

SQL-Abfragestress

SQL Query Stress ist ein Open Source-Tool, mit dem Sie Abfragen für einen SQL Server ausführen können, um die Auslastung zu simulieren. Bei der Ausführung werden keine Abfrageergebnisse an die Anwendung zurückgegeben.

Sie können einige Anweisungen auf der CD lesen hier .

ostress (RML Utilities)

ostress ist ein ähnliches von Microsoft veröffentlichtes Tool, das auch keine Ergebnisse an den Client zurückgibt , es sei denn, Sie entscheiden sich dafür.

Ich habe einige darüber geschrieben hier .

Plan Explorer

SentryOnes Plan Explorer ist eine kostenlose Alternative zum Anzeigen von SQL Server-Ausführungsplänen und Deadlocks.

Sie können es auch als Client verwenden, um SQL Serve bis zu einem gewissen Grad abzufragen:

NÜSSE

Dadurch werden auch die Ergebnisse verworfen.

NÜSSE

Hoffe das hilft!

Erik Darling
quelle
0

Sie können Ihre Abfrage mit ausführen SET STATISTICS TIME ONund die Ausgabenachricht mithilfe Ihrer Überwachungs-App auf Ihrem externen Monitorserver erfassen.

Eine Möglichkeit, die Ausgabenachricht mit .Net zu erfassen, wird in der folgenden Antwort von AdaTheDev zum Stapelüberlauf erläutert :

Sie können dies tun, indem Sie dem InfoMessage- Ereignis auf der Verbindung einen Ereignishandler hinzufügen .

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

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

Könnten Sie nicht einfach die erste Auswahl verwenden, um Ihr @End zurückzugeben?

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

SELECT @ End = GETDATE ()

Wird

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

Nur der letzte Wert wird in der Variablen gespeichert.

Patrick Hurst
quelle