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. 最佳实践

  1. 直方图:倾斜列
  2. EXACT:cursor_sharing
  3. 监控:子游标
  4. 测试:性能
  5. Baseline:稳定
  6. 文档:标记
  7. 不要禁用:除非必要
  8. 升级:12c+
  9. 演练:定期
  10. 基线:对比

14. 参考资料

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