Скрыть выбор вывода из T-SQL

13

Я пытаюсь получить время выполнения запроса, но я также хочу скрыть вывод запроса. Я просто хочу, чтобы истекшее время - без вывода.

пример

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]

На данный момент я получаю вывод запроса и, в конце концов, мою продолжительность, что является единственным, что я хочу, насколько вывод идет. Я не был в состоянии сделать это и задаюсь вопросом, сталкивался ли кто-нибудь еще с подобными проблемами? Это то, что я хочу сделать в T-SQL, а не в Management Studio или чем-то подобном.

Я пытаюсь отслеживать время, необходимое для выполнения оператора select и отправки отчета на сервер. У меня есть внешний сервер мониторинга, который будет запускать эту функцию каждую минуту и ​​получать время назад (продолжительность, которое потребовалось), которое я буду использовать с течением времени для тренда / базовой линии. Поскольку текущий запрос выдает результаты выбора и мою продолжительность, он искажает его, и мой сервер мониторинга запутывается. Я просто хотел столбец продолжительности. Я также буду делать это для вставок, что будет просто, так как не нужно будет выполнять выборку.

Я пытаюсь сделать это чисто в T-SQL . Я не хочу использовать DMV, поскольку хочу получить время, которое требуется (моментальный снимок), когда я запускаю запрос, и проверяю, изменяется ли оно со временем, когда сервер проходит через различные уровни нагрузки, так как это даст мне хорошую идею относительно того, изменяется ли время выполнения запроса.

Гиллиам
источник

Ответы:

28

Есть много разных способов сделать это.

Я обычно не рекомендую вставлять в #tempтаблицу, так как любая нагрузка или автостандартная база данных tempdb может повлиять на результаты, и я определенно не рекомендую использовать @tableпеременную, так как изменения в них являются принудительными последовательными (никакой параллельный план не может быть использован), который может изменить фактическое время запроса.

Назначение переменной

Вы можете объявить переменную и присвоить ей столбцы, например так:

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]

Хотя это может предотвратить оптимизацию встраивания некоторых параметров. См. Перехват параметров, Внедрение и Параметры RECOMPILE в разделе «Ограничение встраивания».

Обратите внимание, что этот метод может вызывать предупреждения плана о неявных преобразованиях, но вам не о чем беспокоиться. См. Этот раздел вопросов и ответов для справки: что вызывает это предупреждение: преобразование типов в выражении может повлиять на «CardinalityEstimate» в выборе плана запроса .

В SSMS

Вы можете изменить настройки, чтобы отменить результаты запроса.

NUTS

SQL Query Stress

SQL Query Stress - это инструмент с открытым исходным кодом, который позволяет запускать запросы к SQL Server для имитации нагрузки. Результаты запроса не возвращаются приложению при запуске.

Вы можете прочитать некоторые инструкции об этом здесь .

ostress (RML Utilities)

ostress - аналогичный инструмент, опубликованный Microsoft, который также не возвращает результаты клиенту, если вы сами не решите это сделать.

Я написал кое-что об этом здесь .

Plan Explorer

SentryOne Plan Explorer - это бесплатная альтернатива для просмотра планов выполнения и взаимоблокировок SQL Server.

Вы также можете использовать его в качестве клиента для запроса SQL-сервера до некоторой степени:

NUTS

Это также отменит результаты.

NUTS

Надеюсь это поможет!

Эрик Дарлинг
источник
0

Вы можете выполнить свой запрос SET STATISTICS TIME ONи захватить выходное сообщение, используя приложение мониторинга на внешнем сервере мониторинга.

Способ захвата выходного сообщения с .Net объясняется в этом ответе переполнением стека по AdaTheDev :

Вы можете сделать это, добавив обработчик событий в событие InfoMessage в соединении.

myConnection.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    myStringBuilderDefinedAsClassVariable.AppendLine(e.Message);
}
Эвандро Мучински
источник
0

Не могли бы вы просто использовать начальный выбор, чтобы вернуть свой @End?

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

SELECT @ End = GETDATE ()

становится

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

В переменной будет храниться только последнее значение.

Патрик Херст
источник