У меня есть два запроса для фильтрации некоторых идентификаторов пользователей в зависимости от вопроса и его ответов.
Сценарий
Запрос 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
Iиспользуйте «установить время статистики» и «установить статистику io вкл.», чтобы проверить время процессора и производительность io.
результат:
CPU time = 47206 ms, elapsed time = 20655 ms.
Я переписал Запрос A с помощью Set Operationпозвольте мне назвать его Запрос 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 раза больше прошедшего времени
Я ищу этот случай, в основном люди говорят, что время ЦП должно быть меньше времени, прошедшего, потому что время ЦП - это то, как долго ЦП выполняет эту задачу.И Истекшее время включает время ввода / вывода и другие виды затрат времени.Но один особый случай, когда сервер имеет несколько основных процессоров.Однако я только что проверил сервер БД разработки, и у него есть одноядерный ЦП.
Вопрос 1
Как объяснить, что время ЦП больше, чем истекшее время в запросе А в среде одноядерного ЦП?
Вопрос 2
После того, как с помощью операции set действительно улучшилась производительность?
У меня возник этот вопрос, поскольку логическое чтение запроса B равно 280627, что выше, чем запрос241885
Брэд МакГи сказал в своей статье, что 'Чем меньше логических операций чтения, выполняемых запросом, тем он эффективнее и быстрее будет выполняться при условии, что все остальные значения равны . '
Чем правильно ли сказано, что даже в Query B более высокие логические чтения, чем в Query A, но время ЦП значительно меньше, чем в Query A,Запрос B должен иметь лучшую производительность.