Oracle 19c增量统计异常:未仅统计数据变更的分区
Oracle增量统计异常(全分区扫描)排查方案
排查方向及可能原因
1. 检查分区统计的过期判定阈值
你设置了INCREMENTAL_STALENESS = USE_STALE_PERCENT,但要确认表级的STALE_PERCENT参数是否被修改(默认是10%)。如果该值被设为0,哪怕分区数据没变化但统计被标记为过期,都会触发全量扫描。
- 执行以下SQL验证:
SELECT stale_percent FROM dba_tab_statistics WHERE owner = 'TABLE_OWNER' AND table_name = 'TABLE_NAME'; - 同时检查所有分区的过期状态:
如果所有分区都显示SELECT partition_name, stale_stats FROM dba_tab_part_statistics WHERE owner = 'TABLE_OWNER' AND table_name = 'TABLE_NAME';YES,说明统计被强制标记为过期,会触发全量收集。
2. 确认分区统计的元数据完整性
增量统计依赖分区的同步元数据,如果表的分区有过变更(比如新增分区后没初始化统计、分区被重命名/合并/拆分),可能导致Oracle无法识别哪些分区是新鲜的。
- 检查每个分区是否有统计记录:
如果存在SELECT partition_name, last_analyzed FROM dba_tab_part_statistics WHERE owner = 'TABLE_OWNER' AND table_name = 'TABLE_NAME';last_analyzed为NULL的分区,Oracle会强制全量扫描来补全统计。
3. 显式指定增量统计参数
你调用gather_table_stats时没指定granularity和incremental参数,虽然表级配置是GRANULARITY = PARTITION和INCREMENTAL = TRUE,但可能被会话级参数或隐式逻辑覆盖。
- 尝试显式指定参数调用:
同时确认有没有误加dbms_stats.gather_table_stats( ownname => 'TABLE_OWNER', tabname => 'TABLE_NAME', estimate_percent => 1, degree => 32, granularity => 'PARTITION', incremental => TRUE );OPTIONS => 'GATHER AUTO',AUTO模式可能会强制全量扫描。
4. 检查统计锁定或异常标记
如果表或分区的统计被锁定,或者被手动标记为过期,会导致增量统计失效。
- 检查统计锁定状态:
SELECT stattype_locked FROM dba_tab_statistics WHERE owner = 'TABLE_OWNER' AND table_name = 'TABLE_NAME'; SELECT stattype_locked FROM dba_tab_part_statistics WHERE owner = 'TABLE_OWNER' AND table_name = 'TABLE_NAME'; - 检查是否有手动标记过期的操作:
SELECT partition_name FROM dba_tab_part_statistics WHERE owner = 'TABLE_OWNER' AND table_name = 'TABLE_NAME' AND stale_stats = 'YES';
5. 核对Oracle版本与补丁
某些早期版本的Oracle(比如12cR2、19c的低补丁版本)存在增量统计的bug,会导致无法识别变更分区。对比其他正常表的数据库版本/补丁,确认是否有差异。
- 查看版本信息:
SELECT * FROM v$version;
6. 检查表的压缩/加密属性
如果该表启用了高级OLTP压缩或TDE加密,部分场景下会干扰增量统计的变更判定逻辑,导致Oracle扫全部分区。对比其他正常表的压缩/加密配置,确认是否存在差异。
内容的提问来源于stack exchange,提问作者user3646666
相关产品推荐
相关产品推荐

