SELECT count(0) FROM table
SELECT count(1) FROM table
SELECT count(colname) FROM table
SELECT count(*) FROM table
这四个语句有什么样的区别啊?
在网上查了很久还是迷茫.
自己也动手测试了一下.
还在晕着呢.
返回结果都一样,但底层操作是不一样的。 对于前三种 count ,数据库只会使用其对应的列上的索引来计算,如果其对应列上没有索引,count的执行效率会非常低。比如SELECT COUNT(COLNAME);
如果 COLNAME 这个列上没有建索引,那就会导致数据库按物理顺序扫描数据文件,效率会很低。
而且 COLNAME 上建聚集索引和非聚集索引的效率也是不一样的。
对于 count(*) 不同数据库优化不一样,SQLSERVER 2005 是首先找聚集索引,没有的话找任意一个非聚集索引,如果还没有,那就按物理堆积来查找。所以偷懒的方法是用 count(*) 效率会比较高。
都一样。都是返回表内所有行数。
SELECT COUNT(0):返回第一列的行数;
SELECT COUNT(1);返回第二列的行数;
SELECT COUNT(COLNAME);返回这一列的行数;
SELECT COUNT(*):返回所有列的行数;
不明白的话再问!呵呵!
这些都是返回表的总行数据
要是从性能上来说,还没有官方的说明
不过要是人select * from table 和 select name,sex from table
的性能来看,后都快于前都,因为*要查看第一个列,后者只查看要返回的列
要是按这个来分析,应该是select count(列名) from table 会快点,个人观点啊.
效率上可能有差别:
如果表中没有任何索引或只有聚集索引,那么这几个的执行都是一样的,都是Clustered Index Scan(聚集索引扫描)
如果表中除了聚集索引之外还有别的索引,并且colname不是索引列,那么将引起Clustered Index Scan(聚集索引扫描),而其他几个都是Index Scan(索引扫描),一般索引扫描比聚集索引扫描效率要高一些,所以不建议使用非索引列的count操作
建议使用最常用的count(*),数据库会选择最优策略,有人说count(0)比count(*)要快,那是假的,别信那套,你看下执行计划就知道了
支持四楼的回答