查看: 43329|回复: 21

select count(*) 与 select count(1)区别?

[复制链接]
论坛徽章:
1
生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
跳转到指定楼层
1#
发表于 2008-5-8 14:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我知道:
select   count(*)是统计表中所有记录个数
而select   count(1)是返回首行
后者的效率比前者要高

请问:
达人们能够解释下两者oracle内部实现的区别?
感谢!
论坛徽章:
3
奥运会纪念徽章:射箭
日期:2008-04-25 10:30:10奥运会纪念徽章:拳击
日期:2008-05-27 21:28:57奥运会纪念徽章:跳水
日期:2008-06-02 09:49:10
2#
发表于 2008-5-8 15:01 | 只看该作者
我觉得两者应该是一样的。

看到有的人说count(*)时系统会选择某一列进行统计,但记得书上说过count(*)是不会对任何字段进行访问的。

至于楼主提到的count(1),个人觉得这只是一个常量,没特别的意思,并非1就是统计首列2就是统计第二列的意思,
因为count(0),count(-1),甚至count('a')也是可以的。

纯属个人意见,等待高手指点。。。

使用道具 举报

回复
论坛徽章:
6
生肖徽章2007版:鼠
日期:2007-11-28 15:47:16辩论纪念章
日期:2010-11-15 09:41:55ITPUB社区12周年站庆徽章
日期:2013-10-08 14:53:15ITPUB社区12周年站庆徽章
日期:2013-10-08 14:56:08ITPUB社区12周年站庆徽章
日期:2013-10-08 14:59:19ITPUB社区12周年站庆徽章
日期:2013-10-08 15:00:34
3#
发表于 2008-5-8 15:02 | 只看该作者
buyiyang

使用道具 举报

回复
论坛徽章:
33
劳斯莱斯
日期:2013-08-08 14:01:23三菱
日期:2013-09-28 10:16:06一汽
日期:2013-11-19 17:01:11凯迪拉克
日期:2013-12-07 17:11:282014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02itpub13周年纪念徽章
日期:2014-09-27 14:20:21itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
4#
发表于 2008-5-8 15:22 | 只看该作者
以前有一个帖子专门说过这个问题,说是不一样,搜一下看下吧

使用道具 举报

回复
论坛徽章:
14
生肖徽章2007版:蛇
日期:2008-03-24 17:16:29生肖徽章2007版:猴
日期:2009-02-09 15:03:45生肖徽章2007版:猪
日期:2009-03-16 10:15:58生肖徽章2007版:龙
日期:2009-03-27 12:02:52生肖徽章2007版:虎
日期:2009-04-15 17:44:55
5#
发表于 2008-5-8 15:35 | 只看该作者
原帖由 yangfei080 于 2008-5-8 14:19 发表
我知道:
select   count(*)是统计表中所有记录个数
而select   count(1)是返回首行
后者的效率比前者要高

请问:
达人们能够解释下两者oracle内部实现的区别?
感谢!


楼主理解错了,select count(1) 可不是返回首列行数
其原理是对数字1进行统计,会将表中所有记录转化为1,然后再计数统计
相当于先select 1 from table 然后count

使用道具 举报

回复
论坛徽章:
1
生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
6#
 楼主| 发表于 2008-5-8 16:38 | 只看该作者

回复 #5 louis_xu 的帖子

测试了一把,louis_xu 说的应该是对的

但是还是不太明白为什么 count(1) 要比 count(*)快呢?
按我的理解count(*)是直接统计记录行数,而count(1)要将每行记录转化为1再统计,应该是count(*)比count(1)快呀?

使用道具 举报

回复
论坛徽章:
25
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010世博会纪念徽章
日期:2010-07-30 12:07:232011新春纪念徽章
日期:2011-02-18 11:43:332010广州亚运会纪念徽章:高尔夫球
日期:2011-04-11 18:22:37蜘蛛蛋
日期:2011-08-17 08:44:40ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15复活蛋
日期:2011-12-15 09:06:552012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:202013年新春福章
日期:2013-02-25 14:51:24
7#
发表于 2008-5-8 17:24 | 只看该作者
一般情况差不多,但
也不一定,看具体的执行计划

[ 本帖最后由 microsoft_fly 于 2008-5-8 17:31 编辑 ]

使用道具 举报

回复
论坛徽章:
281
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-01-04 11:51:22蛋疼蛋
日期:2011-12-29 07:37:22迷宫蛋
日期:2011-12-26 14:19:41茶鸡蛋
日期:2011-11-17 09:20:52茶鸡蛋
日期:2011-11-10 22:42:38ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15茶鸡蛋
日期:2011-10-24 09:48:48ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47
8#
发表于 2008-5-8 17:55 | 只看该作者
count(*)与count(1)没啥区别

count(*) 不一定等于count(col)

使用道具 举报

回复
论坛徽章:
4
开发板块每日发贴之星
日期:2007-12-10 01:05:13生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
9#
发表于 2008-5-8 18:05 | 只看该作者
给yangfei080  有同感
  count(*)是直接统计记录行数,而count(1)要将每行记录转化为1再统计,应该是count(*)比count(1)快呀?

使用道具 举报

回复
论坛徽章:
0
10#
发表于 2008-5-8 18:09 | 只看该作者
以前一直没有留意到COUNT(*)与COUNT(列名)的区别,昨天晚上无意中看到数据库系统工程师教程里面的一句话."如果null参与聚集运算,则除count(*)之外其它聚集函数都忽略null."
      这句话的意思说如果字段是有空值的话,你用SUM去计算,得到的结果有可能不准确.
    看一个实例.
    表A
    ID    EE
      1      e
      2    null
    select  count(*) from A  --结果是2
    select  count(EE)  from A  ---结果是1

http://error1983.blog.sohu.com/39734890.html

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表