Oracle 19c中IMPDP导入分区表后统计信息为空或不全,因IMPDP默认跳过已存在表的统计信息收集;必须手动执行DBMS_STATS.GATHER_TABLE_STATS并显式指定granularity=>'PARTITION'、force=>TRUE及degree=>DBMS_STATS.AUTO_DEGREE方可完整更新分区级统计信息。
oracle 19c 分区表导入后统计信息为空或不全,不是导入失败,而是 impdp 默认跳过统计信息收集 —— 即使你加了 statistics 参数,它也只在目标对象不存在时才收集;若表已存在(比如追加导入),统计信息就完全不碰。
IMPDP 导入后统计信息未更新的典型现象
导入完成后查 USER_TAB_PARTITIONS 或 USER_TAB_STATISTICS,发现 LAST_ANALYZED 为 NULL,或者只有全局统计信息、分区级仍是空的。更隐蔽的问题是:执行 DBMS_STATS.GATHER_TABLE_STATS 时卡住、报错,或部分分区始终不被采集 —— 这往往是因为表结构变更后统计信息元数据残留,导致收集逻辑误判。
- 常见错误日志里没有明显报错,但
SELECT TABLE_NAME, PARTITION_NAME, LAST_ANALYZED FROM USER_TAB_PARTITIONS返回大量NULL - 用
DBMS_STATS.GATHER_SCHEMA_STATS手动触发,结果只更新了非分区表,分区表被跳过 - 导入时用了
TABLE_EXISTS_ACTION=APPEND或REPLACE,但没显式指定统计信息行为
必须显式调用 DBMS_STATS.GATHER_TABLE_STATS 并指定参数
别依赖 IMPDP 自动收集。导入完成后,立刻手动收集,且必须传入关键参数,否则默认行为会忽略分区粒度:
- 必须加
granularity => 'PARTITION',否则只收集表级('GLOBAL')或默认值('AUTO'在某些版本下不可靠) - 必须加
force => TRUE,绕过“统计信息已存在”的跳过逻辑(尤其适用于追加导入场景) - 推荐加
degree => DBMS_STATS.AUTO_DEGREE,避免单线程收集慢得离谱 - 示例命令:
BEGIN DBMS_STATS.GATHER_TABLE_STATS( ownname => 'SCHEMA', tabname => 'ORD_ORDER', granularity => 'PARTITION', force => TRUE, degree => DBMS_STATS.AUTO_DEGREE ); END;
PARTITION_OPTIONS=ADD_PARTITION 场景下的统计信息陷阱
当用 PARTITION_OPTIONS=ADD_PARTITION 导入一个新分区时,该分区物理上被创建,但 DBMS_STATS 不会自动识别它为“待收集对象”——因为它的 LAST_ANALYZED 初始值就是 NULL,而 GATHER_TABLE_STATS 默认只对 LAST_ANALYZED IS NULL 的分区收集。但问题在于:如果表之前已有统计信息,force => FALSE(默认)就会直接跳过整个表。
- 切勿省略
force => TRUE,这是唯一能确保新增分区被纳入本次收集的手段 - 不要依赖
DBMS_STATS.GATHER_SCHEMA_STATS全局扫描——它可能因权限、对象状态或内部缓存跳过刚添加的分区 - 验证是否生效:执行后立即查
SELECT PARTITION_NAME, LAST_ANALYZED FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'ORD_ORDER',确认每个分区都有时间戳
统计信息收集失败时的快速定位步骤
如果 DBMS_STATS.GATHER_TABLE_STATS 报错或静默退出,先检查三个地方:
- 查
DBA_TAB_STATISTICS中该表的STATTYPE_LOCKED字段是否为'ALL'—— 被锁住会导致收集被拒绝,需先执行DBMS_STATS.UNLOCK_TABLE_STATS - 查
V$SESSION_LONGOPS看收集任务是否卡在某个分区(常见于大分区 + 无索引列 +method_opt过于激进) - 临时降低粒度测试:
granularity => 'GLOBAL'能否成功?若可以,说明分区级元数据异常,需重建分区统计信息视图缓存(重启统计信息收集进程或刷新共享池)
最易被忽略的是:即使导入命令里写了 STATISTICS=ALWAYS,只要目标表已存在,IMPDP 就不会触碰统计信息——这个逻辑在 Oracle 19c 中未改变,必须人工补救。


















