Сховати вибраний вихід із 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 Not 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]

Хоча це може запобігти оптимізації вбудовування деяких параметрів. Див. Параметри «Сніфінг параметрів, вбудовування та параметри РЕКОМПІЛЮ» у розділі «Вбудовування обмеження».

Зауважте, що цей метод може викликати попередження плану щодо неявних перетворень, але вони не є видом, про який потрібно турбуватися. Ознайомтесь із цим питанням та запитаннями: Що викликає це попередження: Перетворення типу у виразі може вплинути на «CardinalityEstimate» у виборі плану запитів .

У SSMS

Ви можете змінити налаштування, щоб відхилити результати запитів.

Горіхи

Стрес запиту SQL

Стрес SQL Query - це інструмент з відкритим кодом, який дозволяє запускати запити на SQL Server для імітації навантаження. Результати запитів не повертаються в програму під час їх запуску.

Деякі вказівки на нього ви можете прочитати тут .

ostress (утиліти RML)

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

Я написав про це тут декілька .

План провідника

Провідник плану SentryOne - це безкоштовна альтернатива для перегляду планів виконання та тупиків виконання SQL Server.

Ви також можете використовувати його як клієнта для запиту SQL Serve до певної міри:

Горіхи

Це також відкине результати.

Горіхи

Сподіваюся, це допомагає!


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 () ВІД [DB]. [Dbo]. [STAT]

У змінній зберігатиметься лише останнє значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.