Я пытаюсь определить относительную производительность двух разных запросов, и у меня есть два способа измерения этого:
1. Запустите оба и время каждого запроса
2. Запустите оба и получите «Стоимость запроса» из фактического плана выполнения
Вот код, который я запускаю для определения времени запросов ...
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1a
SELECT getDate() - @start AS Execution_Time
GO
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1b
SELECT getDate() - @start AS Execution_Time
GO
Я получаю следующее:
Stored_Proc Execution_Time Query Cost (Relative To Batch)
test_1a 1.673 seconds 17%
test_1b 1.033 seconds 83%
Результаты времени выполнения прямо противоречат результатам стоимости запроса, но мне трудно определить, что на самом деле означает «стоимость запроса». Мое лучшее предположение состоит в том, что это совокупность операций чтения / записи / CPU_Time / и т. Д., Поэтому у меня есть пара вопросов:
Существует ли конкретный источник, объясняющий, что означает эта мера?
Какие еще метрики "Производительность запроса" используют люди, и каковы их относительные достоинства?
Может быть важно отметить, что это SQL Server среднего размера, работающий под управлением MS SQL Server 2005 на MS Server 2003 Enterprise Edition с несколькими процессорами и более чем 100 одновременными пользователями.
EDIT:
После некоторого беспокойства мне удалось получить доступ к Profiler на этом SQL Server, и я могу предоставить дополнительную информацию (которая поддерживает стоимость запроса, связанную с системными ресурсами, а не с самим временем выполнения ...)
Stored_Proc CPU Reads Writes Duration
test_1a 1313 3975 93 1386
test_1b 2297 49839 93 1207
Впечатляет, что для того, чтобы потреблять больше ресурсов процессора с МНОГИМ большим количеством операций чтения, требуется меньше времени:)