Настройка запросов SQL Server: почему время ЦП превышает истекшее время? Они имеют отношение к операции установки?
У меня есть два запроса для фильтрации некоторых идентификаторов пользователей в зависимости от вопроса и его ответов.
сценарий
Запрос 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", чтобы проверить время процессора и производительность io.
результат:
CPU time = 47206 ms, elapsed time = 20655 ms.
Я переписал Query A с помощью Set Operation, позвольте мне назвать его 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 раза больше времени
Я ищу этот случай, в основном люди говорят, что процессорное время должно быть меньше, чем истекшее время, потому что процессорное время - это то, как долго процессор выполняет эту задачу. И Истекшее время включает время ввода-вывода и другие виды затрат времени. Но один особый случай, когда сервер имеет несколько основных процессоров. Тем не менее, я только что проверил сервер БД разработки, и он имеет одноядерный процессор.
Вопрос 1
Как объяснить, что процессорное время больше, чем затраченное время в запросе A в одноядерной среде ЦП?
вопрос 2
После использования операции set действительно улучшается ли производительность?
У меня есть этот вопрос, потому что логическое чтение запроса B 280627, что выше, чем 241885 запроса A
Брэд МакГи сказал в своей статье: "Чем меньше логических операций чтения, выполняемых запросом, тем он эффективнее и быстрее будет выполняться, если все остальные значения будут одинаковыми".
Чем правильно он говорит, что даже Query B имеет более высокое логическое чтение, чем Query A, но процессорное время значительно меньше, чем Query A, Query B должен иметь лучшую производительность.
2 ответа
Если процессор больше истекшего, у вас есть многоядерный или гиперпоточный процессор
Время ЦП - это то место, где установлен механизм SQL Server. Это не для локальной установки Management Studio.
Что касается логического ввода-вывода против ЦП, я бы пошел с более низким ЦП. Если это выполняется часто и накладывается, вам сначала не хватит ресурсов процессора. Я бы попробовал конструкцию WHERE EXISTS (UNION ALL) и убедился, что у меня хорошие индексы.
Изменить, после комментариев
- в плане присутствуют операторы параллелизма = более одного логического процессора, видимого для ОС и SQL Server. Так что это либо многоядерный, либо гиперпоточный
Попробуйте EXEC xp_msver
В моем случае - время выполнения SQL Server: время процессора = 671 мс, прошедшее время = 255 мс.
Процессорное время было почти в три раза больше, чем истекшее время для запроса. Поскольку запрос обрабатывался параллельно, нагрузка на ЦП была очень высокой, и ЦП мог стать узким местом для этого сценария.
SQL Server 2012 предлагает решение проблемы нагрузки на процессор. В нем представлены итераторы, которые обрабатывают пакеты строк одновременно, а не только ряд за строкой.
Для оптимизации запросов вы можете создать индекс columnstore на вашей таблице-
CREATE COLUMNSTORE INDEX idx_cs_colname ON dbo.Tablename (feild1, feild2);