#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 отображает время выполнения для каждого события
Другой простой способ:
- ОБЪЯВИТЕ 2 переменные datetime: start / end
- УСТАНОВИТЬ start = GETDATE()
- EXEC SP_NAME
- SET end = GETDATE()
- Время выполнения — разница между окончанием и началом
Комментарии:
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
функцию, чтобы получить разницу