Oracle 统计信息过期的表重新收集统计信息

查看当前库中统计信息过期的表:

set linesize 150
set pagesize 1000
EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
SELECT OWNER, TABLE_NAME, PARTITION_NAME, 
       OBJECT_TYPE, STALE_STATS, LAST_ANALYZED 
  FROM DBA_TAB_STATISTICS
 WHERE (STALE_STATS = 'YES' OR LAST_ANALYZED IS NULL)
   -- STALE_STATS = 'YES' 表示统计信息过期:当对象有超过10%的rows被修改时
   -- LAST_ANALYZED IS NULL 表示该对象从未进行过收集统计信息
   AND OWNER NOT IN ('MDDATA', 'MDSYS', 'ORDSYS', 'CTXSYS', 
                     'ANONYMOUS', 'EXFSYS', 'OUTLN', 'DIP', 
                     'DMSYS', 'WMSYS', 'XDB', 'ORACLE_OCM', 
                     'TSMSYS', 'ORDPLUGINS', 'SI_INFORMTN_SCHEMA',
                     'OLAPSYS', 'SYSTEM', 'SYS', 'SYSMAN',
                     'DBSNMP', 'SCOTT', 'PERFSTAT', 'PUBLIC',
                     'MGMT_VIEW', 'WK_TEST', 'WKPROXY', 'WKSYS')
   -- 系统用户表的统计信息状态不做统计,根据需求打开或关闭
   AND TABLE_NAME NOT LIKE 'BIN%'
   -- 回收站中的表不做统计
  order by 1,2;

生成统计信息重新收集的SQL:

set linesize 150
set pagesize 1000
SELECT 'exec DBMS_STATS.GATHER_TABLE_STATS(ownname=>''' || OWNER ||
       ''',tabname=>''' || TABLE_NAME || ''',degree=>4);'
  FROM DBA_TAB_STATISTICS
 WHERE (STALE_STATS = 'YES' OR LAST_ANALYZED IS NULL)
   AND OWNER NOT IN ('MDDATA', 'MDSYS', 'ORDSYS', 'CTXSYS', 
                     'ANONYMOUS', 'EXFSYS', 'OUTLN', 'DIP', 
                     'DMSYS', 'WMSYS', 'XDB', 'ORACLE_OCM', 
                     'TSMSYS', 'ORDPLUGINS', 'SI_INFORMTN_SCHEMA',
                     'OLAPSYS', 'SYSTEM', 'SYS', 'SYSMAN',
                     'DBSNMP', 'SCOTT', 'PERFSTAT', 'PUBLIC',
                     'MGMT_VIEW', 'WK_TEST', 'WKPROXY', 'WKSYS')
   AND TABLE_NAME NOT LIKE 'BIN%'
   AND PARTITION_NAME IS NULL
   -- 非分区表统计信息收集
-- AND OWNER='XXXXXX'
-- 可以单独生成某个用户的统计信息过期表重新收集SQL
union all
SELECT 'exec DBMS_STATS.GATHER_TABLE_STATS(ownname=>''' || OWNER ||
       ''',tabname=>''' || TABLE_NAME || ''',partname=>''' ||
       PARTITION_NAME || ''',degree=>4);'
  FROM DBA_TAB_STATISTICS
 WHERE (STALE_STATS = 'YES' OR LAST_ANALYZED IS NULL)
   AND OWNER NOT IN ('MDDATA', 'MDSYS', 'ORDSYS', 'CTXSYS', 
                     'ANONYMOUS', 'EXFSYS', 'OUTLN', 'DIP', 
                     'DMSYS', 'WMSYS', 'XDB', 'ORACLE_OCM', 
                     'TSMSYS', 'ORDPLUGINS', 'SI_INFORMTN_SCHEMA',
                     'OLAPSYS', 'SYSTEM', 'SYS', 'SYSMAN',
                     'DBSNMP', 'SCOTT', 'PERFSTAT', 'PUBLIC',
                     'MGMT_VIEW', 'WK_TEST', 'WKPROXY', 'WKSYS')
   AND TABLE_NAME NOT LIKE 'BIN%'
   AND PARTITION_NAME IS NOT NULL
   -- 分区表统计信息收集
--AND OWNER='XXXXXX'
-- 可以单独生成某个用户的统计信息过期表重新收集SQL
 order by 1;

几种级别的统计信息收集SQL样例:

exec DBMS_STATS.GATHER_TABLE_STATS(ownname=>'SCOTT',tabname=>'EMP',degree=>4);
exec DBMS_STATS.GATHER_TABLE_STATS(ownname=>'SCOTT',tabname=>'EMP',partname=>'p2018',degree=>4);
-- 表统计信息收集和分区表分区统计信息收集
exec DBMS_STATS.GATHER_INDEX_STATS(ownname=>'SCOTT',indname=>'IND1',degree=4);
exec DBMS_STATS.GATHER_INDEX_STATS(ownname=>'SCOTT',indname=>'IND1',partname=>'p2018',degree=4);
-- 索引统计信息收集和分区索引统计信息收集
exec DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'SCOTT',degree=>4);
-- 用户统计信息收集
exec DBMS_STATS.GATHER_DATABASE_STATS(degree=>4);
-- 全库统计信息收集

-- 增加degree参数增加并行度,加快收集速度
-- 需要考虑当前的主机负载和CPU空闲程度

[TOC]

针对Oracle分区收集统计信息可以通过以下步骤完成: 1. 确定需要收集统计信息的分区。 2. 使用DBMS_STATS包中的GATHER_TABLE_STATS过程收集统计信息。例如: ``` EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>'schema_name',tabname=>'table_name',partname=>'partition_name',cascade=>TRUE,estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE); ``` 其中,ownname代分区所在的schema名称,tabname代分区名称,partname代分区名称,cascade参数指定收集分区的所有分区的统计信息,estimate_percent参数指定使用自动样本大小。 3. 对于大型分区,可以考虑使用INCREMENTAL方法收集统计信息,以便节省收集统计信息的时间和资源。例如: ``` EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>'schema_name',tabname=>'table_name',partname=>'partition_name',cascade=>TRUE,estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt=>'FOR ALL COLUMNS SIZE AUTO INCREMENTAL ON PARTITION(partition_name)'); ``` 其中,method_opt参数指定了使用INCREMENTAL方法收集统计信息,并且只对指定的分区进行增量收集。 4. 在收集完分区统计信息后,可以使用DBMS_STATS.PURGE_TABLE_STATS过程清除过期统计信息。例如: ``` EXEC DBMS_STATS.PURGE_TABLE_STATS(ownname=>'schema_name',tabname=>'table_name',partname=>'partition_name',cascade=>TRUE); ``` 其中,cascade参数指定清除分区的所有分区的统计信息。 以上就是收集Oracle分区统计信息的基本步骤。需要注意的是,统计信息收集频率应该根据分区数据的变化情况来确定,以便保证查询优化器的准确性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值