sybase和Oracle如何统计大表记录
Sybase:
1. select count(*) from table
地球人都知道,但是数据多了查询速度会减慢。
而且限制很多,例如锁阻塞的时候必须得等锁释放了才能返回结果。
2.select rowcnt from systabstats where id = object_id(‘table’)
查询速度快,但基于statistics统计信息,如果统计值没有即使更新(DOL表),查出的值会不准。
如果常做update statistics可以选用。
注:ASE15不适用.
3.select name, rowcnt(sysindexes.doampg) from sysindexes where name = ‘table’
从OAM页中取出记录数,速度又快又准。
最强的是这个查询即使在表有锁阻塞的时候也能查出准确的值。
这样,做批量插入的时也可以同步查询记录条数,不需要再用脏读的方法。
注:ASE15中改为了select row_count(db_id(),object_id('table'))
而且限制很多,例如锁阻塞的时候必须得等锁释放了才能返回结果。
2.select rowcnt from systabstats where id = object_id(‘table’)
查询速度快,但基于statistics统计信息,如果统计值没有即使更新(DOL表),查出的值会不准。
如果常做update statistics可以选用。
注:ASE15不适用.
3.select name, rowcnt(sysindexes.doampg) from sysindexes where name = ‘table’
从OAM页中取出记录数,速度又快又准。
最强的是这个查询即使在表有锁阻塞的时候也能查出准确的值。
这样,做批量插入的时也可以同步查询记录条数,不需要再用脏读的方法。
注:ASE15中改为了select row_count(db_id(),object_id('table'))
Oracle:
你还在苦思冥想怎样快速统计一张装有大量数据的表的总记录数吗?
你还在用select count(*) from table_name 吗?
可以来试试我的新发现:
如果想统计一张上千万或上亿的数据量的时候直接count(*)是非常耗时的,几千万的数据估计都要等上好几分钟。
快速查询表的总记录数:
select table_name, t.num_rows, t.last_analyzed from tabs t;
这里能查出数据库中此用户的所有表中的记录数。
经过查询资料发现,从tabs表中获取的数据不是非常准确,在tabs表中存在一个字段last_analyzed,有最后分析的日期,
好像都不是最新,可能导致数据不是非常准确。
可以通过在command下面执行
EXEC dbms_stats.gather_table_stats('【空间名称】','【tablename】',cascade=>true);
可以刷新tabs表中的num_rows列,以及最后更新时间
什么情况下会做表分析:
1.首先要了解为什么要进行表分析,表分析的结果被Oracle用于基于成本的优化生成更好的查询计划。
所以,一般发现如有个表的查询性能比较差,或者原本有索引但是没有走,那就可以考虑对表进行分析。
2.10g以后都有自动统计信息作业的, 无需用户关心哪些表需要分析,ORACLE自动做分析

浙公网安备 33010602011771号