Я пытаюсь определить относительную производительность двух разных запросов и имею два способа измерения этого для меня:
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%
Результаты времени выполнения напрямую противоречат результатам Стоимость запроса, но мне сложно определить, что означает "стоимость запроса". Мое лучшее предположение заключается в том, что это совокупность Reads/Writes/CPU_Time/и т.д., Поэтому я думаю, у меня есть пара вопросов:
-
Есть ли определенный источник, чтобы объяснить, что означает эта мера?
-
Какие еще показатели производительности "Query Performance" используются людьми и каковы их относительные достоинства?
Возможно, важно отметить, что это 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
Впечатляет, что с большим количеством процессоров с МНОГИМ Чтение занимает меньше времени:)