在oracle生产库中,我的一个表的数据有10亿行记录,怎么快速计算有多少行,不要告诉我用count(*)之类的答案

我听说dba_segments这个数据字典可以计算表的大小和表的平均行大小,然后相除得到大概的行数(因为是海量级的,大概就可以了),但是我在这个数据字典中我只看到表的大小-bytes 这个字段,没有看到表的平均行大小这个字段,有没有谁用过这个方法的,求助!!!因为数据量很大,只要能得到大概值就可以了,不需要十分的精确。

你的这个表有主键没?
如果有主键,假设你的这个表的主键是sid
那么可以使用
select count(sid) from tablename
来查询会比你用count(*) 要快的多。使用主键字段会用到主键索引,会比你去扫描整个表要快的多。
oracle 里面统计某个表的数据行的数量只有使用count函数来求。如果数据量非常大你应该考虑把你的历史数据给清理掉或者使用分区表 。追问

嗯,count(pk),确实是比count(*)快,因为不需要全表扫描,走主键Index就可以了,但是这种方法不是最好的方法,这条命令下去,至少也要半个小时才会有结果。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-26
如果表经常做分析,查询下
select sum(num_rows) from user_tables where table_name = $table_name
可以得到一个大概的近似值,如果想得到准确值,只能使用count
第2个回答  2011-10-25
这种量级的表,估计无论怎样都比较慢吧
能想到可能快点的办法就是 count(pk)

还有比较复杂的方法:建立sequences,然后在表上加tigger,在insert记录时取sequences的值存入;在任何时刻取sequences.currval即知道表的记录数(前提是你永远不会删除表的记录)!

但是…说实话…这种量级的应用,绝对应该分开处理当前事务表与历史数据表的。
第3个回答  2011-10-25
oracle 有个数据字典 表分析之后 会记录行数 貌似是 all_tables追问

嗯,这种方法我也采用过,但是要先将表分析一下all_tables里面才有记录
analyze table t COMPUTE STATISTICS;
select NUM_ROWS from user_tables where TABLE_NAME=' T ';
但是analyze这个命令分析表非常的慢,大概和count(pk)差不多

追答

晕死 大概和count(pk)差不多?
十亿条记录分析怎么也得3-10小时。 但是这个表分析是必须要做的呀。
不然索引,就会统计失真。

本回答被网友采纳
第4个回答  2011-10-26
用伪劣 rowid 就可以
相似回答