为了更好的理解,我必须在where子句的基础上做一些列的总和,我在这里实现一个临时表
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)
并且用于求出a,b,c的总和,以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列和数百万条记录,它将更快地工作?
或任何其他方法可以达到这一目的,这将比这两种方法更好地改善html" target="_blank">性能
扩展马丁的答案-这取决于您拥有的索引以及列的填充方式(可为空)。考虑这个例子。
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列的每一列上都有一个索引,则第一种形式的运行速度可能会更快。一个很大的要求,即使那样,它也可能只会非常快。
问题内容: MySQL中的Case表达式和Case语句有什么区别?什么时候可以使用它们?与另一种相比,使用它们有什么好处? Case Statement语法: 案例表达语法: 这些看起来几乎相同,但是对Case Statements的最初描述是: 那么,在存储程序中使用一个而不在普通查询中使用它的显着区别是吗?我在正在使用的查询中尝试了此操作,但失败了-sqlfiddle。如果是这种情况,为什么不
本文向大家介绍C#实现子窗体与父窗体通信方法实例总结,包括了C#实现子窗体与父窗体通信方法实例总结的使用技巧和注意事项,需要的朋友参考一下 本文实例总结了C#子窗体与父窗体通信方法。分享给大家供大家参考。具体如下: 【第一种方法:】 第一步: 创建接口IForm,父窗体继承这个接口 第二步: 父窗体实现接口中的方法,在实现接口的方法中写入刷新代码 第三步: 在子窗体中调用,刷新的方法 【第二种方法
问题内容: 让 假设我要对列表中每个列表的索引元素求和,例如在矩阵列中添加数字以获得单个列表。我假设数据中的所有列表的长度均相等。 如何遍历列表列表而不会出现索引超出范围错误?也许lambda?谢谢! 问题答案: 您可以尝试以下方法: 这里使用的组合和解压的列表,然后根据自己的索引压缩的项目。然后,您可以使用列表推导来遍历相似索引的组,对其进行求和并返回其“原始”位置。 为了更清楚一点,下面是迭代
我有一个简单的课程: 并有一个List:
本文向大家介绍实现placeholder效果的方案汇总,包括了实现placeholder效果的方案汇总的使用技巧和注意事项,需要的朋友参考一下 placeholder是html5<input>的一个属性,它提供可描述输入字段预期值的提示信息(hint), 该提示会在输入字段为空时显示。高端浏览器支持此属性(ie10/11在获得焦点时文字消失),ie6/7/8/9则不支持。为了兼容各主流浏览器并使其
本文向大家介绍OCaml 汇总列表中的数据,包括了OCaml 汇总列表中的数据的使用技巧和注意事项,需要的朋友参考一下 示例 的List.fold_left和List.fold_right功能是实现列表聚集的外逻辑高阶函数。汇总列表(有时也称为简化列表)意味着计算从对该列表中所有项目的顺序检查得出的值。 列表模块的文档指出: List.fold_left f a [b1; ...; bn]是f (