Настройка запросов к SQL Server: почему время ЦП превышает истекшее время?Они имеют отношение к операции установки? - PullRequest
8 голосов
/ 21 июня 2011

У меня есть два запроса для фильтрации некоторых идентификаторов пользователей в зависимости от вопроса и его ответов.

Сценарий

Запрос 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 должен иметь лучшую производительность.

Ответы [ 2 ]

9 голосов
/ 21 июня 2011

Если ЦП больше истекшего, у вас есть многоядерный или гиперпоточный ЦП

Время ЦП - это то место, где установлен механизм SQL Server.Это не для локальной установки Management Studio.

Что касается логического ввода-вывода против ЦП, я бы выбрал более низкую ЦП.Если это выполняется часто и накладывается, вам сначала не хватит ресурсов процессора.Я бы попробовал конструкцию WHERE EXISTS (UNION ALL) и убедился, что у меня хорошие индексы.

Правка, после комментариев

  • в плане есть операторы параллелизма = более одногоЛогический процессор виден для ОС и SQL Server.Так что это либо многоядерный, либо гиперпоточный

Попробуйте EXEC xp_msver

2 голосов
/ 22 июля 2014

В моем случае - Время выполнения SQL Server: время ЦП = 671 мс, прошедшее время = 255 мс.

Время ЦП было почти в три раза больше, чем истекшее время для запроса.Поскольку запрос обрабатывался параллельно, нагрузка на ЦП была очень высокой, и ЦП может стать узким местом для этого сценария.

SQL Server 2012 предлагает решение проблемы с нагрузкой на ЦП.В нем представлены итераторы, которые обрабатывают пакеты строк одновременно, а не только ряд за строкой.

Для оптимизации запросов вы можете создать индекс columnstore для своей таблицы -

CREATE COLUMNSTORE INDEX idx_cs_colname ON dbo.Tablename (feild1, feild2);

...