我有两个查询,根据问题和答案过滤一些用户ID。
场景:
查询A是(原始版本):
我使用“set statistics time on”和“set statistic io on”来检查CPU时间和IO性能。
结果是:
我通过使用集合操作重写了查询A,让我把它命名为查询B:
CPU时间和经过时间为:
场景:
查询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
我使用“set statistics time on”和“set statistic io on”来检查CPU时间和IO性能。
结果是:
CPU time = 47206 ms, elapsed time = 20655 ms.
我通过使用集合操作重写了查询A,让我把它命名为查询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时间和经过时间为:
CPU time = 8480 ms, elapsed time = 18509 ms
我的简单分析
从上面的结果可以看出,查询A的CPU时间比经过时间长了两倍以上。
我搜索了一下这种情况,大多数人都说CPU时间应该小于经过时间,因为CPU时间是CPU运行此任务所需的时间。而经过时间包括I/O时间和其他类型的时间成本。但有一种特殊情况是当服务器具有多个核心CPU时。然而,我刚刚检查了开发数据库服务器,它只有一个单核心CPU。
问题1
如何解释在单核心CPU环境中查询A的CPU时间大于经过时间?
问题2
使用集合操作后,性能真的得到了改善吗?
我之所以有这个问题,是因为查询B的逻辑读取次数为280627,比查询A的241885要高。
Brad McGehee在他的文章中说:“查询执行的逻辑读取次数越少,它就越有效率,执行速度也就越快,假设所有其他条件相同。”
那么,即使查询B的逻辑读取次数比查询A高,但CPU时间显着少于查询A,那么查询B应该具有更好的性能。