SUBQUERY整体性能VS情况和性能

SUBQUERY整体性能VS情况和性能

问题描述:

我必须做在哪里更好地了解我实现此临时表SUBQUERY整体性能VS情况和性能

declare @tbl table(a int ,b int,c int) 
insert into @tbl values(1,2,3) 
insert into @tbl values(2,2,3) 
insert into @tbl values(1,3,1) 
insert into @tbl values(1,2,3) 
insert into @tbl values(1,2,3) 

条款和寻找的总和,B,C OB的一些列的基础总和a,b,c的价值基础;我使用下面的查询

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 

我问我的一个朋友做一个单一的在线查询这项工作,他建议我以下行

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 

现在我想表现它的运行速度更快如果我有27列和数百万条记录?

或任何其他方法来实现这一目标,这将提高性能比这两个

+1

...并缩短了一点,你不需要else部分... “SELECT SUM(案例一1名时再用1完)一个, 总和(情况b 2时,然后2完)B, 总和(案例c当3然后3月末)C 从@tbl”也将工作 –

扩展Martin的答案 - 这取决于你有什么索引以及列是如何填充的(可以为空或者不可以)。考虑这个例子。

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 

b列创建为空,且只有20%非空。现在,针对表运行查询(没有索引)。在运行之前,请确保按下Ctrl-M(显示实际的执行计划)。在同一批次中运行两个查询,即突出显示两个查询的文本并执行。

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 

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%靠顶部查询对底部的成本和25%的计划。这是预期的,75%:25%= 3:1,这是由于第一次查询完全通过表格3次。现在创建这三个索引:

create index ix_tbl_a on tbl(a) 
create index ix_tbl_b on tbl(b) 
create index ix_tbl_c on tbl(c) 

然后,重新运行查询批处理(一起)。这一次,你会看到大约51%到49%的成本。相当接近。原因是因为(b)列被稀疏填充很容易从SUM只从索引页面。即使是其他两列,每个索引页检索的行数也会比数据页面上的聚集索引(将包含所有列)更多。

当你扩展为27列,第一种形式可以跑得更快,如果每列人口稀少如果你必须在每个27列的索引。一个很大的问题,即使如此,它可能只会稍微快一点。

+0

任何其他方法来实现这一目标,这将提高性能大大优于这两个 – rahularyansharma

+0

一件事indeing上的所有27列,有表上的很多插入和更新不可能 – rahularyansharma

第二种选择使得表中的单次通过好得多;第一个进行多次传球。在性能方面,第二种选择在大多数情况下应该是优越的。

+0

如果我有几百万的记录,然后第二个会检查每个记录..是不是更昂贵,则第一个? – rahularyansharma

+0

如果您正在处理数百万条记录,那么使用第二个选项会更好。随着第一个选项,你会做表的27张通行证,因为它很有可能是只有少数的27列将被索引,许多通行证会降低表扫描。 – iruvar

+0

高兴地看到你的回复,可能是你是正确的,但,我在等待更详细的答案,因为我在前面的问题了,当我询问有关性能的一些SQL大师都与查询执行计划的详细答案.. – rahularyansharma

这取决于你有什么指数。

如果a,bc都被索引,那么原始版本可能会明显更快。特别是如果大部分表格不符合任何标准。

如果你根本没有有用的索引,那么选择三次扫描与一次扫描,所以CASE版本应该更快。