在平常的数据库操作中,有时候我们会进行查询某个表有多少记录数,对于这种问题我们经常就是COUNT(*) 、COUNT(1) 来查询,对于数据量小的表,这种方法是可行的,但是对于数据量较大上千万上亿的表,这种查询是很耗费服务器资源的,而且效率差。这时候我们就需要找到一种快速查询表数据量大小的方法。
执行步骤:
在ORACLE数据库中,可以通过DBA_TABLES、ALL_TABLES、USER_TABLES视图查看表的记录数,不过这个值(NUM_ROWS)跟统计信息有很大的关系,有时候统计信息没有更新或采样比例会导致这个值不是很准确。
如何更新数据库表的统计信息:
方法一:全表分析 完全计算法: analyze table abc compute statistics; 抽样估算法(抽样20%): analyze table abc estimate statistics sample 20 percent; 对表作完全计算所花的时间相当于做全表扫描,抽样估算法由于采用抽样,比完全计算法的生成统计速度要快,如果不是要求要有精确数据的话,尽量采用抽样分析法。建议对表分析采用抽样估算,对索引分析可以采用完全计算。
方法二:
使用dbms_stats
exec dbms_stats.gather_table_stats(OWNNAME=>'tccs',tabname=>'emp',cascade=>true);
在我们经常做表的分析时会看到使用dbms_stats和analyze在这个方面也会有点不同。 就是当使用dbms_stats来分析表的时候global_stats是YES,而用analyze来分析表的时候就是NO. 而且num_rows结果也会有些不同
更新完统计信息之后,下面开始查询表中记录数:
SELECT OWNER ,
TABLE_NAME,
NUM_ROWS ,
LAST_ANALYZED
FROM DBA_TABLES
WHERE OWNER = '&OWNER'
AND TABLE_NAME = '&TABLE_NAME';
SELECT OWNER,
TABLE_NAME,
NUM_ROWS ,
LAST_ANALYZED
FROM ALL_TABLES
WHERE OWNER ='&OWNER'
AND TABLE_NAME='&TABLE_NAME';
SELECT TABLE_NAME,
NUM_ROWS ,
LAST_ANALYZED
FROM USER_TABLES
WHERE TABLE_NAME='&TABLE_NAME'
到此打完收工!
最近准备了一个公众号每天都会推送一些开发中经常遇到的问题解决方法,希望多久关注一下,谢谢支持: