Настройка запросов 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);

Другие вопросы по тегам