Oracle Count() 性能问题

iinbase 2012-05-28 11:34:16
sn_id字段为主键,以下是 count(sn_id) 和 count(*)
执行的时间, 想问, 为何 count(*) 会比count(sn_id) 快?

SELECT
count(sn_id)
FROM
sn {executed in 235 msec}



SELECT
count(sn_id)
FROM
sn {executed in 187 msec}


SELECT
count(sn_id)
FROM
sn {executed in 219 msec}


SELECT
count(sn_id)
FROM
sn {executed in 266 msec}

SELECT
count(sn_id)
FROM
sn {executed in 203 msec}

=====================
SELECT
count(*)
FROM
sn {executed in 188 msec}



SELECT
count(*)
FROM
sn {executed in 172 msec}



SELECT
count(*)
FROM
sn {executed in 172 msec}



SELECT
count(*)
FROM
sn {executed in 172 msec}


SELECT
count(*)
FROM
sn {executed in 156 msec}


SELECT
count(*)
FROM
sn {executed in 172 msec}
...全文
436 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
iinbase 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

当然不一样了,如果s_id没有非空约束,不管该列是不是真的包含空值。

如果是count(s_id)是不包括s_id is null 是全索引快速扫描。
如果count(*) 包括s_id is null 走全表扫描。
这个用执行计划很容易证明。
[/Quote]

sn_id 是主键哦。。。
简即美 2012-05-29
  • 打赏
  • 举报
回复
当然不一样了,如果s_id没有非空约束,不管该列是不是真的包含空值。

如果是count(s_id)是不包括s_id is null 是全索引快速扫描。
如果count(*) 包括s_id is null 走全表扫描。
这个用执行计划很容易证明。
iqlife 2012-05-29
  • 打赏
  • 举报
回复
通常使用的是COUNT(*)
zll793027848 2012-05-29
  • 打赏
  • 举报
回复
这个问题纠结的!!!!
槑党--一缕风 2012-05-28
  • 打赏
  • 举报
回复
count(*)与count(字段)含义不同,结果不同。

create table #aa(f int)
insert #aa(f) select 1 union all select 2 union all select 2 union all select 3 union all select 3 union all select 3 union all select 4 union all select 4 union all select 4 union all select 4 union all select null
select count(*) from #aa
select count(f) from #aa
go

a494910091 2012-05-28
  • 打赏
  • 举报
回复
你这样的数据查询结果会有意义吗,差距微乎其微!
查看他们的执行计划,都是走的主键索引!
count(*) 是oracle内部针对表已经做好处理的,以前有中说法叫count 某列会快些的说法,其实是不然的!再个 count 某列 的结果 与 count(*)的结果不一定会一样,当某列为空时 则不会就行数!
iinbase 2012-05-28
  • 打赏
  • 举报
回复
测试过 count(*) , count(1), count(sn_id)

耗时最少的 都是 count(*) ,并且最稳定
a494910091 2012-05-28
  • 打赏
  • 举报
回复
大虾就非常谈不上了。。 两个△ ⊙﹏⊙!
项目中需要 select count( )需要经常操作,这个几乎每个项目都会经常用到的,一般的分页都会用到,经常是先count(*) 一次得到总页数 ,再做操作的。
用count(*) 完全没问题,oracle内部已经对count(*)做过处理的,而且count(列)的数据结果不一定正确。

刚学的时候谁都会这样做,直接比对查询结果的速度!这是最正常不过的思维了,不会像某些码侬写了代码根本就不管什么效率的事情了,已经非常不错了。再个这种查询 直接比对下他们的执行计划就知道了,执行方式都是通过 走 主键索引来统计的!
iinbase 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你这样的数据查询结果会有意义吗,差距微乎其微!
查看他们的执行计划,都是走的主键索引!
count(*) 是oracle内部针对表已经做好处理的,以前有中说法叫count 某列会快些的说法,其实是不然的!再个 count 某列 的结果 与 count(*)的结果不一定会一样,当某列为空时 则不会就行数!
[/Quote]

首先要 先谢谢您的解析,
因为项目需要,select count() 需要经常操作,并且并发量比较大,数据量又特别的大
所以才发了自己的一些想法出来比较,请教各位大虾而已
huan_lxyd 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你这样的数据查询结果会有意义吗,差距微乎其微!
查看他们的执行计划,都是走的主键索引!
count(*) 是oracle内部针对表已经做好处理的,以前有中说法叫count 某列会快些的说法,其实是不然的!再个 count 某列 的结果 与 count(*)的结果不一定会一样,当某列为空时 则不会就行数!
[/Quote]
+1
a494910091 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
你可以试试用count(1) 按理来说 会更快!
[/Quote]
按的什么理?
  • 打赏
  • 举报
回复
你可以试试用count(1) 按理来说 会更快!

17,377

社区成员

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

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