【性能调优】快速获得表中记录件数


在论坛上与一位朋友讨论如何获得表中记录件数时,从maclean老师那里得到提示,发现可以从user_tables或dba_tables表中快速获得表中记录件数。


那位朋友的问题贴:
----------------------------------
数据库中有个表每天都有更新删除,追加的操作,如何能查询出这个表每天总共有多少条记录??


大家多帮忙啊
----------------------------------

我的问题确认
----------------------------------
似乎楼主只是想确认一下是否因为数据量增加而导致plsql变慢了。
如果只是想统计一下表中数据记录的件数,来确认一下是否有数据增加,用于问题调查的话,似乎并不麻烦,简单的select count(1) from 表名 即可。  
不知是不是我理解错了楼主问这个问题的本意……
----------------------------------

那位朋友的回帖
----------------------------------
楼上理解的没错,关键问题是我只是知道当前的记录数,过去每天的就无法获得了
----------------------------------

针对上面那位朋友提到的记录保留的问题,我的回帖
----------------------------------
xiaoma0401 发表于 2011-11-5 20:41 
楼上理解的没错,关键问题是我只是知道当前的记录数,过去每天的就无法获得了


其实进行问题调查的话,观察几天或连续一定间隔地观察几次大体就可以判明问题了,
一般次数不会需要太多,所以可以写一组select count(1) from tblname 脚本,然后每次把执行结果保留下来,几次对比即可。(如黏贴到excel中观察)

如果感觉不好对比,也可以专门建一个表,包含表名、记录件数、操作日期 几个字段就可以了,
每次使用insert  into 。。。select  语法,类似如下将检索记录插入到表中即可。
insert into cntTbl (表名,记录件数,操作日期)
select ‘dept’  as name,
          count(1) as cnt,
          to_char(sysdate,'YYYY-MM-DD')  as opdate
from dept
gruop by name,cnt,opdate;
commit;


以上,供参考,希望能有帮助

----------------------------------

maclean老师的回帖,回帖中提到了利用oracle统计信息来获取表中记录件数的思想。
-----------------------------------
xiaoma0401 发表于 2011-11-5 20:41 
楼上理解的没错,关键问题是我只是知道当前的记录数,过去每天的就无法获得了

The old statistics are purged automatically at regular intervals based on the statistics history retention setting and the time of the recent analysis of the system. Retention is configurable using the ALTER_STATS_HISTORY_RETENTION procedure of DBMS_STATS. The default value is 31 days, which means that you would be able to restore the optimizer statistics to any time in last 31 days.

历史统计信息 一般会保留31天。 这些信息包括表的num_rows

------------------------------------

这里先对maclean老师提到的DBMS_STATS.ALTER_STATS_HISTORY_RETENTION 这个存储过程简单介绍一下,资料中的,直接拷贝过来。
---------------

ALTER_STATS_HISTORY_RETENTION

Enable or disable autopurging of statistic histories

dbms_stats.alter_stats_history_retention(retention IN NUMBER);

NULL = change to default value
   0 = never save old stats, autopurge statistics history
   1 = statistics history never purged by autopurge 

exec dbms_stats.alter_stats_history_retention(0);

---------------

下面是我根据maclean老师的提示,做的一个简单的实验。
但是像我在下面“TO楼主”部分提到的,由于user_tables、dba_tables的信息来源于Oracle自动收集的统计信息,而这个信息有时肯那个并非最新的,所以,user_tables、dba_tables的信息一般仅供参考。
如果想使用这两个user_tables、dba_tables来得到准确信息,需要在查询user_tables、dba_tables之前,
对需要查询的表手动执行以下表分析。
analyze table table_name compute statsticstic ;

--------------------------------------------------
本帖最后由 chicheng_cn421 于 2011-11-6 07:43 编辑
maclean 发表于 2011-11-6 00:36 
The old statistics are purged automatically at regular intervals based on the statistics history r ...

跟 maclean 老师又学到新东西,谢谢!

可以利用Oracle自己的统计信息,来得到表中记录的行数。简单做了个实验。
-----------------------------------------------
■在当前用户下查询 user_tables  
SQL> conn scott/tiger
已连接。
SQL>  select table_name,tablespace_name, num_rows,table_lock from user_tables where table_name in ('DEPT','EMP');

TABLE_NAME                     TABLESPACE_NAME                  NUM_ROWS TABLE_LO
------------------------------ ------------------------------ ---------- --------
DEPT                           USERS                                   4 ENABLED
EMP                            USERS                                  14 ENABLED

已选择2行。

SQL> select count(1) from dept;

  COUNT(1)
----------
         4

已选择 1 行。

SQL> select count(1) from emp;

  COUNT(1)
----------
        14

已选择 1 行。

■再换到dba_tables  下查询试试,发现信息一样,而且如果需要查询多个用户下的表的话,使用 dba_tables 更加方便。 
SQL> conn / as sysdba
已连接。
SQL>  select owner,table_name,tablespace_name, num_rows,table_lock from dba_tables where table_name in ('DEPT','EMP');

OWNER                          TABLE_NAME                     TABLESPACE_NAME                  NUM_ROWS TABLE_LO
------------------------------ ------------------------------ ------------------------------ ---------- --------
SCOTT                          DEPT                           USERS                                   4 ENABLED
SCOTT                          EMP                            USERS                                  14 ENABLED

已选择2行。

SQL>

-----------------------------------------------

TO楼主
Oracle的统计信息是定期启动相关Job来自动收集的,
但是,偶有情况,统计信息收集不是很及时,导致我们看到的统计信息不是最新的,
所以这种方法可参考价值很大,但如果 个别表记录件数与想定件数差异较大,建议再利用select count(1) from 表名  的方式再自己手动验证一下。


或着像下面这样先对相关表重新进行表分析,重新收集统计信息后,再查询user_tables或dba_tables。
analyze table table_name compute statsticstic ;
---------------------------------------------------

以上。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20335819/viewspace-710313/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20335819/viewspace-710313/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值