Я пытаюсь рассчитать время / сравнить запрос как часть более широкого анализа производительности.
В SQL я включил синхронизацию через SET statistics time ON
, и запрос, который я задаю, выглядит как SELECT A, B from foo where id = 123
. Перед каждым запросом я выполняю:
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
Ниже приведены результаты 2 прогонов (не впоследствии):
Прогон 1:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 8 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
(1212 row(s) affected)
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 15 ms.
Прогон 2:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 3 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
(1212 row(s) affected)
SQL Server Execution Times:
CPU time = 16 ms, elapsed time = 14 ms.
Чего я не понимаю, так это:
- Почему существуют 2 раздела 'разбора и времени компиляции' и почему результаты одного запроса различны?
- Включены ли время разбора и компиляции во время ЦП под ними
- Почему процессорное время 0 в 'run 1'
- Почему время ЦП превышает прошедшее время в 'run 2'
Не очень ясно, какое число предоставляет ЦП Пользовательское время, то есть сколько времени фактически потребовался мой запрос, который должен быть не более истекшего времени.
В более широком смысле, у меня есть приложение, интенсивно использующее данные, которое читает только из базы данных - каждый запрос выполняется быстро, но он может запрашивать много данных и делает это с помощью отдельных запросов, а не навалом. Является ли проблемой то, что я пытаюсь рассчитать время для отдельного запроса - я должен создать сценарий SQL, который занимает более значимое время, чем несколько миллисекунд? Для меня ответ - «Да», но я беспокоюсь, что не пойму поведение при микроскопическом тесте, прежде чем перейти к макроскопическому тесту.