Nascondi Seleziona output da T-SQL


13

Sto cercando di ottenere il tempo di esecuzione della query, ma voglio anche nascondere l'output della query. Voglio solo il tempo trascorso - nessun risultato.

Esempio

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]

Al momento, ottengo un output di query e in fondo la mia durata, che è l'unica cosa che desidero per quanto riguarda l'output. Non sono stato in grado di farlo e mi chiedo se qualcun altro ha riscontrato problemi simili? Questo è qualcosa che voglio fare in T-SQL, non in Management Studio o qualcosa del genere.

Sto cercando di monitorare il tempo necessario per eseguire l'istruzione select e riferire a un server. Ho un server di monitoraggio esterno che lo eseguirà ogni minuto e recupererà il tempo (durata necessaria) che userò nel tempo per l'andamento / baseline. Poiché la query corrente sputa i risultati selezionati e la mia durata la distorce e il mio server di monitoraggio viene confuso. Volevo solo la colonna della durata. Lo farò anche per gli inserti, che sarà semplice in quanto non sarà necessario eseguire una selezione.

Sto provando a farlo puramente in T-SQL . Non voglio usare i DMV perché voglio ottenere il tempo necessario (istantanea) quando eseguo una query e controllo se questo cambia nel tempo quando il server attraversa i vari livelli di carico in quanto ciò mi darà una buona idea se cambia il tempo di esecuzione della query.

Risposte:


28

Esistono molti modi diversi per farlo.

Di solito non raccomando l'inserimento in una #temptabella, poiché qualsiasi carico tempdb o autogrowth può influire sui risultati e sicuramente non consiglio l'uso di una @tablevariabile, poiché le modifiche a queste sono seriali forzate (non è possibile utilizzare alcun piano parallelo), che può modificare i tempi effettivi delle query.

Assegnazione variabile

Puoi dichiarare una variabile e assegnargli le tue colonne, in questo modo:

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]

Tuttavia, ciò potrebbe impedire l'ottimizzazione di alcuni parametri. Vedere Opzioni di annusamento dei parametri, incorporamento e RICOMPILE in "Limitazione dell'incorporamento".

Tieni presente che questo metodo può attivare avvisi di piano sulle conversioni implicite, ma non sono il tipo di cui ti devi preoccupare. Vedi queste domande e risposte per informazioni preliminari: cosa attiva questo avviso: la conversione del tipo in Expression può influire su "CardinalityEstimate" nella scelta del piano di query .

In SSMS

È possibile modificare le impostazioni per eliminare i risultati della query.

NOCCIOLINE

Stress query SQL

SQL Query Stress è uno strumento open source che consente di eseguire query su un SQL Server per simulare il carico. Nessun risultato di query viene restituito all'applicazione quando viene eseguito.

Puoi leggere alcune istruzioni qui .

ostress (Utilità RML)

ostress è uno strumento simile, pubblicato da Microsoft, che inoltre non restituisce risultati al client, a meno che non si scelga di farlo.

Ne ho scritto un po ' qui .

Plan Explorer

Plan Explorer di SentryOne è un'alternativa gratuita per visualizzare i piani di esecuzione e i deadlock di SQL Server.

Puoi anche usarlo come client per interrogare SQL Serve in una certa misura:

NOCCIOLINE

Questo eliminerà anche i risultati.

NOCCIOLINE

Spero che sia di aiuto!


0

È possibile eseguire la query con SET STATISTICS TIME ONe acquisire il messaggio di output utilizzando l'app di monitoraggio sul server di monitoraggio esterno.

Un modo per catturare il messaggio di output con .Net è spiegato in questa risposta Stack Overflow di AdaTheDev :

È possibile farlo aggiungendo un gestore eventi all'evento InfoMessage sulla connessione.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

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

0

Non potresti semplicemente utilizzare la selezione iniziale per restituire il tuo @End?

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

SELECT @ End = GETDATE ()

diventa

SELEZIONA @ Fine = GETDATE () DA [DB]. [Dbo]. [STAT]

Nella variabile verrà memorizzato solo l'ultimo valore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.