COUNT()函数的性能问题

太上绝情 2013-06-27 09:38:35
table表中有不止一列
select count(*) from table

select count(id) from table
有什么性能差别吗
第二种是否会好一些呢?
...全文
887 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
Persistence_x 2013-07-08
  • 打赏
  • 举报
回复
要说优化上肯定是第2种查询到一列的执行速度快!
forgetsam 2013-07-03
  • 打赏
  • 举报
回复
引用 29 楼 soloopin 的回复:
[quote=引用 26 楼 forgetsam 的回复:] [quote=引用 25 楼 kinlin 的回复:] 有人拿大数据作过测试吗?最好出来说说,个人感觉两者相差不大,几乎一样,没必要在这点可忽略的时间上做文章
执行计划比感觉可靠,也比闷头测试可靠。[/quote] 装牛逼的家伙, 搞个皮包公司就以为自己很厉害了[/quote] 给同学打杂做零工混点饭而已,哪里就看出来很厉害了? 比你这“211、985”出来连碗饭都混不到的厉害点而已,没事别歪楼,有点起码的素质。
soloopin 2013-07-03
  • 打赏
  • 举报
回复
引用 30 楼 forgetsam 的回复:
[quote=引用 29 楼 soloopin 的回复:] [quote=引用 26 楼 forgetsam 的回复:] [quote=引用 25 楼 kinlin 的回复:] 有人拿大数据作过测试吗?最好出来说说,个人感觉两者相差不大,几乎一样,没必要在这点可忽略的时间上做文章
执行计划比感觉可靠,也比闷头测试可靠。[/quote] 装牛逼的家伙, 搞个皮包公司就以为自己很厉害了[/quote] 给同学打杂做零工混点饭而已,哪里就看出来很厉害了? 比你这“211、985”出来连碗饭都混不到的厉害点而已,没事别歪楼,有点起码的素质。[/quote] 呵呵, 我混不到饭吃,我的工资我还要告诉你?! 扯你妈的蛋,到处装牛逼。
soloopin 2013-07-02
  • 打赏
  • 举报
回复
引用 26 楼 forgetsam 的回复:
[quote=引用 25 楼 kinlin 的回复:] 有人拿大数据作过测试吗?最好出来说说,个人感觉两者相差不大,几乎一样,没必要在这点可忽略的时间上做文章
执行计划比感觉可靠,也比闷头测试可靠。[/quote] 装牛逼的家伙, 搞个皮包公司就以为自己很厉害了
Moriarty_徐 2013-07-02
  • 打赏
  • 举报
回复
容我插一句,计数的时候,使用count(1)代替count(*)效率是不是更高一些呢
zgycsmb 2013-07-02
  • 打赏
  • 举报
回复
第二种要好, 性能好些.
forgetsam 2013-07-02
  • 打赏
  • 举报
回复
引用 25 楼 kinlin 的回复:
有人拿大数据作过测试吗?最好出来说说,个人感觉两者相差不大,几乎一样,没必要在这点可忽略的时间上做文章
执行计划比感觉可靠,也比闷头测试可靠。
Regan-lin 2013-07-01
  • 打赏
  • 举报
回复
如果你是单单要查id第2个效率肯定比第一个高,而且再数据多的时候这就不是一般效率的差距了!
vanjayhsu 2013-07-01
  • 打赏
  • 举报
回复
引用 16 楼 ziwen00 的回复:
COUNT(*) OR COUNT(N) 与 COUNT(ID) 首先保证正确性,其次保证效率。 正确性的优先:如果id为非空或主键,则会走索引,因为等同于条件IS NOT NULL。 效率的优先:如果LZ说的前提“不止一列”改为“只有一列”,则不会走索引,因为单行索引的BLOCK是大于单行的DATA的。其他如LS所言。
首先保证正确性,其次保证效率。--这个是总体思想。顶一个。
linwaterbin 2013-07-01
  • 打赏
  • 举报
回复
引用 18 楼 SKY_4K_PPM 的回复:
用count(*) 或 count(id)完全根据用户的需要, 性能上绝对不会有什么差异,因为Oracle对这种统计有自己的一套处理方法。 再者 用不用索引 是要看 where语句
1)表是大表、肯定会有差异 2)用不用索引、不一定看索引、如果谓词没有id、id列照样走索引
多壮志 2013-07-01
  • 打赏
  • 举报
回复
引用 18 楼 SKY_4K_PPM 的回复:
用count(*) 或 count(id)完全根据用户的需要, 性能上绝对不会有什么差异,因为Oracle对这种统计有自己的一套处理方法。 再者 用不用索引 是要看 where语句
要看where这是对的。不过说count(*)和count(id)一样绝对是最大的错误。 我前面说的时候,是暂时没有考虑where的情况。
kinlin 2013-07-01
  • 打赏
  • 举报
回复
有人拿大数据作过测试吗?最好出来说说,个人感觉两者相差不大,几乎一样,没必要在这点可忽略的时间上做文章
devid 2013-07-01
  • 打赏
  • 举报
回复
引用 2 楼 zhaoxiangchong 的回复:
count(*)会包含空值,而count(id)则不会。如果id有索引的话,还是用count(id)会比较快点
count(*)比较快点....
devid 2013-07-01
  • 打赏
  • 举报
回复
count(*)与count(id)获取同样的行数相比,count(*)速度快!
SKY_4K_PPM 2013-06-29
  • 打赏
  • 举报
回复
用count(*) 或 count(id)完全根据用户的需要, 性能上绝对不会有什么差异,因为Oracle对这种统计有自己的一套处理方法。 再者 用不用索引 是要看 where语句
太上绝情 2013-06-29
  • 打赏
  • 举报
回复
好多大牛,学习了。
陈字文 2013-06-29
  • 打赏
  • 举报
回复
COUNT(*) OR COUNT(N) 与 COUNT(ID) 首先保证正确性,其次保证效率。 正确性的优先:如果id为非空或主键,则会走索引,因为等同于条件IS NOT NULL。 效率的优先:如果LZ说的前提“不止一列”改为“只有一列”,则不会走索引,因为单行索引的BLOCK是大于单行的DATA的。其他如LS所言。
陈字文 2013-06-29
  • 打赏
  • 举报
回复
引用 11 楼 dobetterthatnthink 的回复:
很多人对于这种常识性的还存在疑虑,是因为对SQL的查询优化器不够熟悉。 查询依赖于统计信息(通常是这样)以及一些基本连接,访问路径等等。 比较典型的情况COUNT(*)就是要返回所有记录,如果有索引可以用,那么oracle基本会利用索引。另COUNT(*) 和COUNT(N),n是一个常数本质上没有任何区别。 至于COUNT(COL)即某个列,着得看情况,如果COL不属于现有索引的列,那么就的全表扫描,否则就可以利用索引了。而且有一点很重要的是,COUNT(COL)中COL中有空值在回被忽略。 所以统计记录数和统计字段数是完全不同的概念,只是某些情况下会等价而已。 能利用索引,毫无疑问会更快一些,一般情况下在大表上,索引的数据量总是比表的数量来得少一些。 以上说的适合oracle10g以上。 oracle正变得越来越智能,写sql可以越来越随心所欲。
+1
sych888 2013-06-28
  • 打赏
  • 举报
回复
在互相 “挑理” 学习,应该会进步快些?论坛会不会更加活跃了?希望大家互相拍砖啊,呵呵!
sych888 2013-06-28
  • 打赏
  • 举报
回复
引用 7 楼 linwaterbin 的回复:
[quote=引用 6 楼 sych888 的回复:] [quote=引用 1 楼 linwaterbin 的回复:] 1) count(*) 统计所有行、很难走索引、或者走索引代价极大、CBO不会走 2)count(id)统计 id 不为 空的行、如果id列有索引、就可以走索引 综上、在满足业务的情况下、第二种好、
1)count(*) 优化器会判断是否可以走索引的,如果含有主键或非空索引,那么计划就会走索引 2)如果ID列不是通常的B索引,或者该列就没有索引,那么count(ID)为统计非空和空的行总数 SQL> select count(*) from 2 (select null from dual union all 3 select 1 from dual) t; COUNT(*) ---------- 2[/quote] 1)count(*) 优化器会判断是否可以走索引的是的、会判断、CBO会对所有可能的路线都进行判断、然后选择其中成本最低的那条去走、如果含有主键或非空索引,那么计划就会走索引你所认为的含主键走索引、也是把索引当"瘦表"来回答一个查询、至于"非空索引"这个我有点不太理解?非空?b树索引不能存空值吧 2)count(ID)为统计非空和空的行总数即便不存在索引、你都认为count(id)统计总行数吗?如果是这样、我不是很赞同、[/quote] 1) "非空索引” 我说的可能不太清楚,我指的是 非空约束的索引列 SQL> create table t(id int not null,nn varchar2(50)); 表已创建。 SQL> create index idx_id on t(id); 索引已创建。 2)至于这个问题,您可以举个反例,这样大家能更好的明白
加载更多回复(12)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧