基于执行计划对比两个SQL查询:为何结果与预期相反?
SQL查询性能对比的执行计划困惑
我参考Stack Overflow上的查询性能相关帖子,对比两个SQL查询的性能并分析执行计划时,遇到了和原帖结论相反的结果,产生了困惑。
测试步骤
创建测试表(无额外索引)
create table tbl ( id int identity primary key, a int, b int, c int, d int ) insert tbl values (1, 2, 3, null) insert tbl values (2, null, 3, 1) insert tbl values (1, null, 1, 4) insert tbl values (1, null, 3, 5) insert tbl values (1, null, 3, 6) insert tbl select a, b, c, d from tbl --数据量变为10 insert tbl select a, b, c, d from tbl --20 insert tbl select a, b, c, d from tbl --40 insert tbl select a, b, c, d from tbl --80 insert tbl select a, b, c, d from tbl --160 insert tbl select a, b, c, d from tbl --320 insert tbl select a, b, c, d from tbl --640 insert tbl select a, b, c, d from tbl --1280 insert tbl select a, b, c, d from tbl --2560 insert tbl select a, b, c, d from tbl --5120 insert tbl select a, b, c, d from tbl --10240
执行两个查询
子查询版本
SELECT (SELECT SUM(a) FROM tbl WHERE a = 1) AS a, (SELECT SUM(b) FROM tbl WHERE b = 2) AS b, (SELECT SUM(c) FROM tbl WHERE c = 3) AS c
CASE聚合版本
SELECT SUM((CASE WHEN a = 1 THEN a ELSE NULL END)), SUM((CASE WHEN b = 2 THEN b ELSE NULL END)), SUM((CASE WHEN c = 3 THEN c ELSE NULL END)) FROM tbl
疑问点
原帖的公认答案显示:子查询版本的查询成本约占75%,CASE语句版本约占25%,比例为3:1,原因是子查询会三次遍历表。但我的测试结果完全相反:子查询版本的单部分成本为27%(合计约81%),CASE语句版本成本为85%。
我原本认为CASE语句版本仅需遍历一次表,速度应该更快、成本更低,所以想知道:是我误解了执行计划的成本计算,还是当前的测试结果属于正常情况?
内容的提问来源于stack exchange,提问作者user8512043
相关产品推荐
相关产品推荐

