Oracle Adaptive Cursor Sharing 详解
Oracle Adaptive Cursor Sharing 详解
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Adaptive Cursor Sharing (ACS) 解决 Bind Peeking 问题[1]:
详细见:Oracle 优化器 CBO 原理、Oracle 直方图与统计信息。
2. Bind Peeking
2.1 概念
- 绑定变量窥探
- 9i+ 默认启用
- 首次执行时窥探
- 生成执行计划
2.2 问题
- 数据倾斜
- 不同绑定值最优计划不同
- 但计划固定
- 性能问题
3. ACS 原理
3.1 自适应
- 监视绑定值
- 多个执行计划
- 根据值选择
- 自适应
3.2 流程
1. 首次执行:窥探 + 生成计划
2. 监视性能
3. 不同值不同计划
4. 维护多个子游标
4. 查看
4.1 视图
SELECT sql_id, child_number, executions,
buffer_gets, is_bind_sensitive, is_bind_aware
FROM v$sql
WHERE sql_id = '&sql_id';
SELECT * FROM v$sql_cs_statistics;
SELECT * FROM v$sql_cs_selectivity;
SELECT * FROM v$sql_cs_histogram;
4.2 标志
- IS_BIND_SENSITIVE:绑定敏感
- IS_BIND_AWARE:绑定感知
- IS_SHAREABLE:可共享
5. 工作流程
5.1 Bind Sensitive
- 列有直方图
- 使用绑定变量
- 标记为 Bind Sensitive
- 监视
5.2 Bind Aware
- 多次执行
- 性能差异大
- 标记为 Bind Aware
- 生成多个子游标
5.3 选择
- 根据绑定值选择性
- 选择合适子游标
- 不同值不同计划
6. 直方图
6.1 必须
- ACS 需要直方图
- 列数据倾斜
- DBMS_STATS 收集
6.2 收集
EXEC DBMS_STATS.GATHER_TABLE_STATS(
'SCOTT', 'EMP',
method_opt => 'FOR COLUMNS salary SIZE 254'
);
详细见:Oracle 直方图与统计信息。
7. 游标共享
7.1 多子游标
- 不同绑定值范围
- 不同子游标
- 不同执行计划
7.2 限制
- 子游标数量
- cursor_sharing
- 监控
8. 配置
8.1 参数
-- 默认启用
ALTER SYSTEM SET "_optimizer_adaptive_cursor_sharing" = TRUE;
ALTER SYSTEM SET "_optimizer_extended_cursor_sharing" = TRUE;
8.2 cursor_sharing
ALTER SYSTEM SET cursor_sharing = EXACT; -- 推荐
-- FORCE 可能影响 ACS
9. 应用场景
9.1 数据倾斜
- 列数据倾斜
- 不同值不同计划
- ACS 自适应
9.2 范围查询
- BETWEEN
- 不同范围
- 不同计划
9.3 等值查询
- 等值
- 不同值
- 直方图
10. 性能
10.1 优势
- 多计划
- 性能优化
- 自适应
10.2 开销
- 解析开销
- 子游标内存
- 监控
11. 监控
11.1 子游标
SELECT child_number, executions, buffer_gets,
is_bind_sensitive, is_bind_aware
FROM v$sql
WHERE sql_id = '&sql_id';
11.2 选择性
SELECT child_number, predicate, range_id, low, high
FROM v$sql_cs_selectivity
WHERE sql_id = '&sql_id';
12. 常见问题
12.1 不生效
- 无直方图
- 数据不倾斜
- 检查
12.2 子游标过多
- 监控
- 限制
- cursor_sharing
12.3 计划不稳定
- ACS 优势
- 监控
- Baseline 固定
13. 最佳实践
- 直方图:倾斜列
- EXACT:cursor_sharing
- 监控:子游标
- 测试:性能
- Baseline:稳定
- 文档:标记
- 不要禁用:除非必要
- 升级:12c+
- 演练:定期
- 基线:对比
14. 参考资料
[1] Oracle Database SQL Tuning Guide 19c, “Adaptive Cursor Sharing” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/