首页 新闻 会员 周边 捐助

关于select count的问题

0
悬赏园豆:50 [已解决问题] 解决于 2008-11-17 17:22

SELECT count(0)  FROM table

SELECT count(1)  FROM table

SELECT count(colname)  FROM table

SELECT count(*)  FROM table

这四个语句有什么样的区别啊?

在网上查了很久还是迷茫.

自己也动手测试了一下.

还在晕着呢.

smile-lee的主页 smile-lee | 初学一级 | 园豆:120
提问于:2008-11-17 14:19
< >
分享
最佳答案
0

返回结果都一样,但底层操作是不一样的。 对于前三种 count ,数据库只会使用其对应的列上的索引来计算,如果其对应列上没有索引,count的执行效率会非常低。比如SELECT COUNT(COLNAME);

如果 COLNAME 这个列上没有建索引,那就会导致数据库按物理顺序扫描数据文件,效率会很低。

而且 COLNAME 上建聚集索引和非聚集索引的效率也是不一样的。

对于 count(*) 不同数据库优化不一样,SQLSERVER 2005 是首先找聚集索引,没有的话找任意一个非聚集索引,如果还没有,那就按物理堆积来查找。所以偷懒的方法是用 count(*)  效率会比较高。

eaglet | 专家六级 |园豆:17139 | 2008-11-17 15:03
其他回答(5)
0

都一样。都是返回表内所有行数。  

West | 园豆:1095 (小虾三级) | 2008-11-17 14:27
0

SELECT COUNT(0):返回第一列的行数;

SELECT COUNT(1);返回第二列的行数;

SELECT COUNT(COLNAME);返回这一列的行数;

SELECT COUNT(*):返回所有列的行数;

不明白的话再问!呵呵!

子夜星辰 | 园豆:1613 (小虾三级) | 2008-11-17 14:46
0

这些都是返回表的总行数据

要是从性能上来说,还没有官方的说明

不过要是人select * from table 和 select name,sex from table

的性能来看,后都快于前都,因为*要查看第一个列,后者只查看要返回的列

 要是按这个来分析,应该是select count(列名) from table 会快点,个人观点啊.

程序员老李 | 园豆:790 (小虾三级) | 2008-11-17 15:01
0

效率上可能有差别:

如果表中没有任何索引或只有聚集索引,那么这几个的执行都是一样的,都是Clustered Index Scan(聚集索引扫描)

如果表中除了聚集索引之外还有别的索引,并且colname不是索引列,那么将引起Clustered Index Scan(聚集索引扫描),而其他几个都是Index Scan(索引扫描),一般索引扫描比聚集索引扫描效率要高一些,所以不建议使用非索引列的count操作

建议使用最常用的count(*),数据库会选择最优策略,有人说count(0)比count(*)要快,那是假的,别信那套,你看下执行计划就知道了

丁学 | 园豆:18730 (专家六级) | 2008-11-17 16:07
0

支持四楼的回答

天堂口 | 园豆:514 (小虾三级) | 2008-11-17 16:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册