Oracle Pending Statistics 详解

Oracle Pending Statistics 详解

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Pending Statistics 允许统计信息待发布[1]:

详细见:Oracle 优化器统计信息管理


2. 优势

2.1 测试

- 收集统计
- 不立即发布
- 测试效果
- 发布或回退

2.2 安全

- 避免统计变更导致计划退化
- 测试验证
- 渐进

3. 配置

3.1 启用 Pending

-- 全局
ALTER SYSTEM SET optimizer_use_pending_statistics = TRUE;

-- 会话
ALTER SESSION SET optimizer_use_pending_statistics = TRUE;

3.2 表级

-- 启用 Pending
EXEC DBMS_STATS.SET_TABLE_PREFS('SCOTT', 'EMP', 'PUBLISH', 'FALSE');

-- 查看
SELECT * FROM dba_tab_stat_prefs
WHERE table_name = 'EMP';

4. 收集

4.1 收集到 Pending

-- 表已启用 PUBLISH=FALSE
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'EMP');

-- 统计存入 Pending

4.2 强制 Pending

EXEC DBMS_STATS.GATHER_TABLE_STATS(
  'SCOTT', 'EMP',
  publish => FALSE
);

5. 查看

5.1 Pending 统计

SELECT * FROM user_tab_pending_stats;
SELECT * FROM user_ind_pending_stats;
SELECT * FROM user_col_pending_stats;

5.2 当前统计

SELECT * FROM user_tables WHERE table_name = 'EMP';
SELECT * FROM user_tab_columns WHERE table_name = 'EMP';

6. 测试

6.1 启用 Pending

-- 测试会话
ALTER SESSION SET optimizer_use_pending_statistics = TRUE;

6.2 测试

-- 执行 SQL
SELECT * FROM emp WHERE dept_id = 10;

-- 查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR));

6.3 对比

- 当前统计计划
- Pending 统计计划
- 评估

7. 发布

7.1 发布 Pending

EXEC DBMS_STATS.PUBLISH_PENDING_STATS('SCOTT', 'EMP');

7.2 验证

SELECT num_rows, last_analyzed FROM user_tables WHERE table_name = 'EMP';

8. 删除

8.1 删除 Pending

EXEC DBMS_STATS.DELETE_PENDING_STATS('SCOTT', 'EMP');

9. 应用场景

9.1 统计更新测试

- 大表统计更新
- 测试影响
- 发布

9.2 计划稳定性

- 避免计划退化
- 测试
- 渐进

9.3 升级评估

- 升级前
- 统计变更
- 测试

10. 流程

10.1 完整流程

-- 1. 启用 Pending
EXEC DBMS_STATS.SET_TABLE_PREFS('SCOTT', 'EMP', 'PUBLISH', 'FALSE');

-- 2. 收集
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'EMP');

-- 3. 测试
ALTER SESSION SET optimizer_use_pending_statistics = TRUE;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('...'));

-- 4. 决策
-- 发布
EXEC DBMS_STATS.PUBLISH_PENDING_STATS('SCOTT', 'EMP');
-- 或删除
EXEC DBMS_STATS.DELETE_PENDING_STATS('SCOTT', 'EMP');

-- 5. 恢复
EXEC DBMS_STATS.SET_TABLE_PREFS('SCOTT', 'EMP', 'PUBLISH', 'TRUE');

11. 与 SPA 配合

11.1 SPA 测试

- Pending 统计
- SPA 评估
- 综合

详细见:Oracle SQL Performance Analyzer 详解


12. 监控

12.1 Pending

SELECT table_name, partition_name, num_rows, last_analyzed
FROM user_tab_pending_stats;

12.2 性能

SELECT sql_id, plan_hash_value, elapsed_time
FROM v$sql
WHERE sql_text LIKE '%emp%';

13. 常见问题

13.1 测试不生效

- optimizer_use_pending_statistics
- 检查

13.2 发布错误

- 测试不充分
- 评估
- 回退

13.3 冲突

- 多会话
- 测试隔离

14. 最佳实践

  1. 关键表:启用
  2. 测试:充分
  3. 对比:计划
  4. SPA:评估
  5. 发布:谨慎
  6. 回退:预案
  7. 监控:性能
  8. 文档:记录
  9. 演练:定期
  10. 清理:Pending

15. 参考资料

[1] Oracle Database SQL Tuning Guide 19c, “Pending Statistics” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/