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

来源:互联网 发布:北大方正字体淘宝收费 编辑:程序博客网 时间:2024/04/20 21:42
情景:一个表里面数据有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:有主键么?如果没有主键执行计划将会是全表扫描


原创粉丝点击