Настройка запросов 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 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 время должно быть меньше, чем прошедшее время, потому что время ЦП - это время, в течение которого ЦП выполняет эту задачу. Истекшее время включает время ввода-вывода и другие временные затраты. Но один особый случай - это когда сервер имеет несколько ядер ЦП. Однако Я только что проверил сервер базы данных разработки, и у него один одноядерный ЦП.

Вопрос 1

Как объяснить, что время ЦП больше, чем Прошедшее время в запросе А в среде одноядерного ЦП t?

Вопрос 2

После использования операции установки, действительно ли производительность улучшилась?

У меня есть этот вопрос, потому что логическое чтение запроса B составляет 280627, что выше, чем у 241885

запроса A Brad McGehee сказал в своей статье, что «Чем меньше логических операций чтения, выполняемых запросом, тем он эффективнее и быстрее, при условии, что все остальные параметры остаются равными » [. 12246] Тогда правильно ли он говорит, что даже у запроса B больше логических чтений, чем у запроса A, но время ЦП значительно меньше, чем у запроса A, запрос B должен иметь лучшую производительность.

8
задан Karthik Venkatraman 10 December 2015 в 11:01
поделиться