select count(*) 速度慢的原因主要有什么?

本文探讨了Oracle数据库中COUNT(*)操作缓慢的问题,并分析了可能的原因是由于表的高水位线导致的数据分布不均。通过对比旧表和新建表的性能差异,揭示了DELETE操作对表结构的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

情景: 一个表里面数据有 2400 多行,执行 select count(*) 竟然需要 8 秒多;

把这个表的索引删除重建之后再执行select count(*)还是要花费8秒多。
重建了一个结构一模一样的表,把同样数据导入之后,对新表执行count(*)就只需要几十ms
想来想去造成速度慢的原因可能是:这点数据分布在不同的块上,所以执行count(*)的时候速度极慢。


说法1:执行计划如果走的是full table scan,就有可能是高水位

关于oracle的高水位问题,首先要明白delete操作和truncate操作两者之间的不同,情景中说到表里数据不多但是执行很慢,有可能就是该表之前存在有大量数据,但是这些数据被delete处理掉了,但是delete操作是不会使水位线降低,背后可能是百万级数据量。同时情景中也说到,重新建立了一个表,把数据导入后count出来的时间很短,也可以说明重新建表后,表的水位线是最低的,2400条数据count起来就很快。

关于水位线的理解可以参考:http://www.ithao123.cn/content-106848.html

说法2:有主键么?如果没有主键执行计划将会是全表扫描


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值