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. 最佳实践
- 关键表:启用
- 测试:充分
- 对比:计划
- SPA:评估
- 发布:谨慎
- 回退:预案
- 监控:性能
- 文档:记录
- 演练:定期
- 清理:Pending
15. 参考资料
[1] Oracle Database SQL Tuning Guide 19c, “Pending Statistics” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/