Как найти время выполнения хранимых процедур в SQL Server?

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть 10 хранимых процедур следующим образом: SP1, SP2, ….., SP10 Эти хранимые процедуры выполняют некоторые действия. Мне нужно запустить эти процедуры следующим образом: ВЫПОЛНИТЬ SP1; ВЫПОЛНИТЬ SP2; … ВЫПОЛНИТЬ SP10;

Когда SQL server завершает выполнение этих процедур, он выдает десять строк, показывающих любые изменения строк, вызванные всеми этими хранимыми процедурами. Что я хочу сделать, так это то, что после выполнения всех хранимых процедур SQL Server также выдает в окне вывода время выполнения для каждой хранимой процедуры.Могу ли я это сделать? Я уверен, что для достижения этой задачи мне нужно изменить хранимые процедуры, но я понятия не имею, как это сделать… Пожалуйста, помогите мне. Спасибо.

Ответ №1:

Предполагая, что management Studio или какая-либо другая среда с панелью вывода, которую вы можете;

 SET STATISTICS TIME ON
EXEC SP1
EXEC SP2
...
SET STATISTICS TIME OFF
  

Ответ №2:

Вы можете использовать профилировщик Sql Server для этих целей, он также предоставляет много полезной информации по каждому выполняемому запросу и хранимой процедуре.

MSDN: столбцы данных SQL Profiler

SQL Profiler отображает время выполнения для каждого события

Другой простой способ:

  1. ОБЪЯВИТЕ 2 переменные datetime: start / end
  2. УСТАНОВИТЬ start = GETDATE()
  3. EXEC SP_NAME
  4. SET end = GETDATE()
  5. Время выполнения — разница между окончанием и началом

Комментарии:

1. Ссылка на описание столбца данных теперь указывает на «Удаленную техническую документацию SQL Server 2000». Первая ссылка (на профилировщик Sql Server) все еще работает. У меня нет разрешения на редактирование ответа.

2. Спасибо за ответ. Я нашел разницу между двумя датами, используя: datediff(millisecond, @start, @end)

Ответ №3:

 declare @start datetime = getdate()

-- your SQL statements
exec dbo.MyStoredProcedure

declare @executionTimeInMilliseconds int = datediff(ms, @start, getdate())
  

Ответ №4:

Вам вообще не нужно изменять код SPs. Следующий запрос дает вам некоторую статистику о времени выполнения SPs.

 SELECT 
   DB_NAME(database_id) [database],
   OBJECT_NAME(object_id) [stored_procedure],
   cached_time, 
   last_execution_time, 
   execution_count,
   total_elapsed_time/execution_count [avg_elapsed_time],
   [type_desc]
FROM sys.dm_exec_procedure_stats
--WHERE OBJECT_NAME(object_id) IN ('SP1','SP2','SP3','SP4','SP5')
ORDER BY avg_elapsed_time desc;
  

Просто попробуйте.

Ответ №5:

Есть способы сделать это с помощью таких инструментов, как Sql Server profiler, но простой способ — запустить каждую процедуру, окруженную строкой, для печати времени:

 print convert(varchar, getdate(), 21)
EXEC PROC SP1
print convert(varchar, getdate(), 21)
  

Комментарии:

1. зачем вам конвертировать в varchar ??? В основном, что вам нужно сделать, это взять разницу в миллисекундах до и после запуска процедуры

2. Просто так вы можете получить форматированный вывод, такой как 2011-10-14 12:32:39.403 . Если оставить его как datetime, это не обязательно даст вам миллисекунды, а сообщение только о разнице приведет к потере дополнительных данных о том, когда оно было запущено, в случае, если оно оставлено без присмотра.

Ответ №6:

захват и отображение времени выполнения

используйте два параметра datetime типа и задайте один, используя getdate() перед запуском tsql в хранимой процедуре

и установите второе использование getdate() after tsql и, наконец, используйте datediff функцию, чтобы получить разницу