欢迎投稿

今日深度:

DB2中的count(1)与sum(1),

DB2中的count(1)与sum(1),


今天在某群中看到有同学问DB2中的count(1)和sum(1)是什么意思。

习惯了使用count(*)或sum(ColName),很少这样直接写数字。不假思索之下觉得好像是对第1个字段求count或sum吧,但有些吃不准。搜了一通也不知所然。

测试一下吧

//环境:DB2 8.2 FP7(DB2/NT 8.2.7)

//测试数据
create table test (c1 date, c2 varchar(60))
insert into test (c1, c2) values (currentdate, ‘小虎’)
insert into test (c1, c2) values (currentdate, '阿花')
insert into test (c1, c2) values (currentdate, '小F')

select count(*), count(1) from test
// 3 3
select count(*), count(2) from test
// 3 3
select count(*), count(10) from test
// 3 3
select count(*), count(‘hello’) from test
// 3 3

select count(*), sum(1) from test
// 3 3
select count(*), sum(2) from test
// 3 6
select count(*), sum(10) from test
// 3 30
select count(*), sum(‘hello’) from test
// 报错:),SQL0440N 未找到类型为"FUNCTION" 命名为 "SUM" 且具有兼容自变量的已授权例程。SQLSTATE=42884

结论

count(1)中的1是一个常量,如果你喜欢,也可以用count(2),count('hello') 。

sum求和也一样,但和count计数不同,sum参数只能是数值。数值常量情况下,结果相当于count(1)乘上数值,即:

sum(1)=count(1)=count(*)

sum(2)=coun(1)*2


结论之外

1、以上测试在MS-SQL 2000中结果一样。但不排除在其它DBMS产品或其它DB2、MS-SQL版本有不同的实现,比如有群友提到在Teradata中1就是表示第1个字段(手边没有环境,未验证)。

2、count(1)与count(*)的结果一样,但实现过程、执行效率有没有区别?

时间关系没有专门做测试,有人在MS-SQL(SQL Server2005 SP2)上做过测试比较,结论有:count(*)和count(1)的执行效率是完全一样;count(*)的执行效率比count(col)高,因此可以用count(*)的时候就不要去用count(col);count(col)的执行效率比count(distinctcol)高,不过这个结论的意义不大,这两种方法使用场合不同;如果是对特定的列做count的话建立这个列的非聚集索引能对count有很大的帮助;如果经常count(*)的话则可以找一个最小的col建立非聚集索引以避免全表扫描而影响整体性能。


www.htsjk.Com true http://www.htsjk.com/teradata/36855.html NewsArticle DB2中的count(1)与sum(1), 今天在某群中看到有同学问DB2中的count(1)和sum(1)是什么意思。 习惯了使用count(*)或sum(ColName),很少这样直接写数字。不假思索之下觉得好像是对第1个字段求count或...
相关文章
    暂无相关文章
评论暂时关闭