У меня есть два запроса для фильтрации некоторых идентификаторов пользователей в зависимости от вопроса и ответов на него.
Запрос A (исходная версия):
SELECT userid
FROM mem..ProfileResult
WHERE ( ( QuestionID = 4
AND QuestionLabelID = 0
AND AnswerGroupID = 4
AND ResultValue = 1
)
OR ( QuestionID = 14
AND QuestionLabelID = 0
AND AnswerGroupID = 19
AND ResultValue = 3
)
OR ( QuestionID = 23
AND QuestionLabelID = 0
AND AnswerGroupID = 28
AND ( ResultValue & 16384 > 0 )
)
OR ( QuestionID = 17
AND QuestionLabelID = 0
AND AnswerGroupID = 22
AND ( ResultValue = 6
OR ResultValue = 19
OR ResultValue = 21
)
)
OR ( QuestionID = 50
AND QuestionLabelID = 0
AND AnswerGroupID = 51
AND ( ResultValue = 10
OR ResultValue = 41
)
)
)
GROUP BY userid
HAVING COUNT(*) = 5
Я использую ' установите время статистики на 'и' установите статистику io on ', чтобы проверить время процессора и производительность io.
результат:
CPU time = 47206 ms, elapsed time = 20655 ms.
Я переписал запрос A с помощью операции Set, позвольте мне назвать его Query B:
SELECT userid
FROM ( SELECT userid
FROM mem..ProfileResult
WHERE QuestionID = 4
AND QuestionLabelID = 0
AND AnswerGroupID = 4
AND ResultValue = 1
INTERSECT
SELECT userid
FROM mem..ProfileResult
WHERE QuestionID = 14
AND QuestionLabelID = 0
AND AnswerGroupID = 19
AND ResultValue = 3
INTERSECT
SELECT userid
FROM mem..ProfileResult
WHERE QuestionID = 23
AND QuestionLabelID = 0
AND AnswerGroupID = 28
AND ( ResultValue & 16384 > 0 )
INTERSECT
SELECT userid
FROM mem..ProfileResult
WHERE QuestionID = 17
AND QuestionLabelID = 0
AND AnswerGroupID = 22
AND ( ResultValue = 6
OR ResultValue = 19
OR ResultValue = 21
)
INTERSECT
SELECT userid
FROM mem..ProfileResult
WHERE QuestionID = 50
AND QuestionLabelID = 0
AND AnswerGroupID = 51
AND ( ResultValue = 10
OR ResultValue = 41
)
) vv;
Процессорное время и прошедшее время:
CPU time = 8480 ms, elapsed time = 18509 ms
Как вы можете видеть из предыдущего результата, запрос A имеет процессорное время более чем в 2 раза больше прошедшего времени
Я ищу этот случай, в основном люди говорят, что CPU время должно быть меньше, чем прошедшее время, потому что время ЦП - это время, в течение которого ЦП выполняет эту задачу. Истекшее время включает время ввода-вывода и другие временные затраты. Но один особый случай - это когда сервер имеет несколько ядер ЦП. Однако Я только что проверил сервер базы данных разработки, и у него один одноядерный ЦП.
Как объяснить, что время ЦП больше, чем Прошедшее время в запросе А в среде одноядерного ЦП t?
После использования операции установки, действительно ли производительность улучшилась?
У меня есть этот вопрос, потому что логическое чтение запроса B составляет 280627, что выше, чем у 241885
запроса A Brad McGehee сказал в своей статье, что «Чем меньше логических операций чтения, выполняемых запросом, тем он эффективнее и быстрее, при условии, что все остальные параметры остаются равными » [. 12246] Тогда правильно ли он говорит, что даже у запроса B больше логических чтений, чем у запроса A, но время ЦП значительно меньше, чем у запроса A, запрос B должен иметь лучшую производительность.