Как замерить время выполнения sql запроса
Как быстро найти «тормозное» место в скрипте
Бывает, скрипт выполняется слишком долго. И нужно понять — а где именно он тормозит?
Первый вариант — смотрим план запроса. Это классика.
Второй вариант — расставляем метки времени прямо в коде. Проще и нагляднее, чем кажется. Вот о нём и поговорим.
Создаём вспомогательную функцию
Нам понадобится функция, которая выводит время с момента запуска. Вот она:
Create or ALTER FUNCTION [dbo].[as_sec]
(
@text as nvarchar(max),
@start datetime
)
RETURNS varchar(max)
AS
BEGIN
DECLARE @res as nvarchar(max)=
cast(cast(DATEDIFF(millisecond,@start,getdate())/1000.0 as decimal(18,2)) as nvarchar) + ' sec - ' + @text
RETURN @res
END
Функция принимает текст и стартовую метку. На выходе — сколько секунд прошло и твой комментарий. Всё просто.
Как это работает на практике
Допустим, у нас есть несколько запросов подряд. Вставляем вызов функции после каждого:
DECLARE @t1 DATETIME = Getdate();
print [dbo].[as_sec] ('start', @t1)
select top 400 * from as_trace
print [dbo].[as_sec] ('after select 1', @t1)
select top 1000 * from as_trace
print [dbo].[as_sec] ('after select 2', @t1)
select top 20 * from as_trace
print [dbo].[as_sec] ('after select 3', @t1)
Запускаем — и видим в выводе что-то вроде:

Сразу видно: вот этот запрос отъел больше всего времени. Остальные — мелочь.
Такой подход спасает, когда план запроса не даёт полной картины. Например, если тормозит не сам SELECT, а цикл или временная таблица.
Ещё удобно добавить метки внутри цикла — чтобы понять, на какой итерации всё встаёт колом.
Коротко о главном
- Создаёшь функцию для замера времени.
- Ставишь метки в ключевых точках скрипта.
- Смотришь вывод — и сразу видишь проблемное место.
Никакой магии. Просто рабочий инструмент, который я сам использую постоянно.
Что еще посмотреть по SQL Server
Как запустить SQL сценарий сразу на нескольких БД
Индексы SQL Server. Поиск дубликатов
Запрос для получения SQL всех индексов для таблиц базы данных SQL Server
Как перестроить все индексы на базе SQL Server
Как разрезать строку на части в SQL по некоторому символу
Конвертация из строки в таблицу в SQL Server
Выполнение прямого запроса к URL из SQL
SQL Server Как установить у таблицы описание (MS Description)
Как получить текущего юзера БД
Дополнительный заработок для разработчиков на T-SQL
- Шаг 1. Создать концепт проекта
- Шаг 2. Получить оценку бюджета (КП)
- Шаг 3. Заключить договор
- Шаг 4. Создать совместно техническое задание
- Шаг 5. Поэтапная реализация проекта