oracle分区表的增量收集统计信息

本文详细介绍了Oracle数据库中分区表的增量统计信息收集功能,包括如何查看和更新统计信息,以及增量统计信息的工作原理。通过实例展示了如何只针对有变化的分区收集统计信息,以减少资源消耗,并探讨了Oracle在处理NDV等复杂统计信息时的策略,如自适应采样和HyperLogLog算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分区表的增量统计信息收集
分区表的统计信息存在global和partition级别两种。在收集分区表的全局统计信息的时候,不可避免的要对表的所有分区进行统计,但是由于表分区的初衷,不同分区数据变化情况很可能不一致。那么极容易出现有的分区统计信息是准的,有的分区是不准的,扫描所有分区必然造成资源多余消耗,增量收集统计信息功能就可以解决这个问题了。该功能只针对有变化的分区收集统计信息,然后将其与没有变化的分区的统计信息做合并,得到完整的表的统计信息。

scott下面恰好存在一张以前做实验的分区表
SQL> select table_owner,table_name,partition_name,tablespace_name from dba_tab_partitions where table_owner='SCOTT' and table_name='CMP';

TABLE_OWNER   TABLE_NAME   PARTITION_NAME      TABLESPACE_NAME
------------- ------------ ------------------- -------------------
SCOTT         CMP          YY1_TMP             YY1
SCOTT         CMP          YY2_TMP             YY2
SCOTT         CMP          YY3_TMP             YY3
SCOTT         CMP          T_RANGE_PMAX_TMP    YY4

SQL> select count(*) from cmp;

  COUNT(*)
----------
      4000

查看当前的全局统计信息
SQL> select table_name,num_rows,last_analyzed from dba_tables where table_name='CMP';

TABLE_NAME                       NUM_ROWS LAST_ANALYZED
------------------------------ ---------- -------------------
CMP                                  4000 2017-10-24 22:00:13

当前的分区级别统计信息
SQL> select table_name,partition_name,num_rows,last_analyzed from dba_tab_partitions where table_name='CMP';
TABLE_NAME           PARTITION_NAME                   NUM_ROWS LAST_ANALYZED
-------------------- ------------------------------ ---------- -------------------
CMP                  YY1_TMP                               999 2017-10-24 22:01:17
CMP                  YY2_TMP                              1000 2017-10-24 22:01:17
CMP                  YY3_TMP                              1000 2017-10-24 22:01:17
CMP                  T_RANGE_PMAX_TMP                     1001 2017-10-24 22:01:17

可以看到统计信息很陈旧了。我先收集其中一个分区的统计信息,作为对比。
exec dbms_stats.gather_table_stats(ownname=>'scott',tabname=>'cmp',partname=>'YY1_TMP');

PL/SQL procedure successfully completed.


收集一个分区后的全局和分区统计信息

SQL> select table_name,num_rows,last_analyzed from dba_tables where table_name='CMP';

TABLE_NAME             NUM_ROWS LAST_ANALYZED
-------------------- ---------- -------------------
CMP                        4000 2018-09-12 05:28:45

SQL> select table_name,partition_name,num_rows,last_analyzed from dba_tab_partitions where table_name='CMP';

TABLE_NAME           PARTITION_NAME                   NUM_ROWS LAST_ANALYZED
-------------------- ------------------------------ ---------- -------------------
CMP                  YY1_TMP                               999 2018-09-12 05:28:45
CMP                  YY2_TMP                              1000 2017-10-24 22:01:17
CM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值