Ocultar saída de seleção do T-SQL

13

Estou tentando obter tempo de execução da consulta, mas também quero ocultar a saída da consulta. Eu só quero o tempo decorrido - sem saída.

Exemplo

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]

No momento, recebo a saída da consulta e, na parte inferior, a minha duração, que é a única coisa que desejo até a saída. Não fui capaz de fazer isso e me pergunto se mais alguém se deparou com problemas semelhantes. Isso é algo que eu quero fazer no T-SQL, não no Management Studio ou algo assim.

Estou tentando monitorar o tempo que leva para executar a instrução select e relatar de volta para um servidor. Eu tenho um servidor de monitor externo que o executa a cada minuto e recupera o tempo (duração que levou) que utilizarei ao longo do tempo para criar tendências / linhas de base. À medida que a consulta atual exibe os resultados selecionados, minha duração é distorcida e meu servidor de monitor fica confuso. Eu só queria a coluna de duração. Também farei isso nas inserções, o que será direto, pois não será necessário executar uma seleção.

Estou tentando fazer isso puramente em T-SQL . Não quero usar DMVs, pois quero obter o tempo necessário (instantâneo) ao executar uma consulta e verificar se isso muda com o tempo, quando o servidor passa pelos vários níveis de carga, pois isso me dará uma boa idéia. se o tempo de execução da consulta muda.

Gilliam
fonte

Respostas:

28

Existem várias maneiras diferentes de fazer isso.

Normalmente, não recomendo a inserção em uma #temptabela, pois qualquer carga de tempdb ou crescimento automático pode afetar os resultados, e definitivamente não recomendo o uso de uma @tablevariável, pois as modificações são forçadas em série (nenhum plano paralelo pode ser usado), o que pode alterar os tempos reais de consulta.

Atribuição variável

Você pode declarar uma variável e atribuir suas colunas a ela, assim:

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]

Embora isso possa impedir algumas otimizações de incorporação de parâmetros. Consulte Detecção de parâmetros, incorporação e as opções RECOMPILE em "Uma restrição de incorporação".

Observe que esse método pode acionar avisos de plano sobre conversões implícitas, mas não é do tipo que você precisa se preocupar. Consulte estas perguntas e respostas para obter mais informações: O que dispara este aviso: Conversão de tipo na expressão pode afetar "CardinalityEstimate" na escolha do plano de consulta .

No SSMS

Você pode alterar as configurações para descartar os resultados da consulta.

NUTS

Estresse de Consulta SQL

Estresse de Consulta SQL é uma ferramenta de código aberto que permite executar consultas em um SQL Server para simular o carregamento. Nenhum resultado da consulta é retornado ao aplicativo quando é executado.

Você pode ler algumas instruções aqui .

ostress (RML Utilities)

ostress é uma ferramenta semelhante, publicada pela Microsoft, que também não retorna resultados ao cliente, a menos que você opte por fazê-lo.

Eu escrevi um pouco sobre isso aqui .

Plan Explorer

O Plan Explorer do SentryOne é uma alternativa gratuita para visualizar os planos de execução do SQL Server e os impasses.

Você também pode usá-lo como um cliente para consultar o SQL Serve até certo ponto:

NUTS

Isso também descartará os resultados.

NUTS

Espero que isto ajude!

Erik Darling
fonte
0

Você pode executar sua consulta SET STATISTICS TIME ONe capturar a mensagem de saída usando seu aplicativo de monitoramento em seu servidor de monitor externo.

Uma maneira de capturar a mensagem de saída com .Net é explicada nesta resposta do Stack Overflow por AdaTheDev :

Você pode fazer isso adicionando um manipulador de eventos ao evento InfoMessage na conexão.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

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

Você não pode apenas usar a seleção inicial para retornar seu @ End?

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

SELECT @ End = GETDATE ()

Torna-se

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

Somente o último valor seria armazenado na variável

Patrick Hurst
fonte