在Oracle数据库中,绑定变量的使用能有效减少硬解析次数,提升SQL执行效率,但传统游标共享机制下,同一条SQL的不同绑定变量值可能会匹配到不合适的执行计划,引发性能问题。Oracle自适应游标共享(Adaptive Cursor Sharing)就是针对这一痛点推出的优化特性。

自适应游标共享的核心原理
传统游标共享机制中,Oracle会为一条SQL生成固定的执行计划,后续相同SQL不同绑定变量值都会复用该计划,当绑定变量值的选择性差异较大时,比如查询条件中某个字段既有少量重复值也有大量重复值,固定的执行计划就可能无法适配所有场景。
自适应游标共享会为同一条SQL维护多个子游标,每个子游标对应不同的执行计划,同时会记录绑定变量的选择性和其他统计信息,当SQL再次执行时,Oracle会根据当前的绑定变量值、历史执行统计信息,动态选择最匹配的子游标执行,从而实现执行计划的自适应调整。
自适应游标共享的判断机制
自适应游标共享主要通过两个核心维度判断是否需要生成新的子游标:
- 绑定变量选择性:Oracle会统计绑定变量值对应的数据分布,当选择性差异超过阈值时,会认为原有执行计划不再适配。
- 执行统计信息变化:如果同一SQL不同执行次数下的执行时间、逻辑读等统计指标差异较大,也会触发新的子游标生成。
系统会通过V$SQL视图中的IS_BIND_SENSITIVE、IS_BIND_AWARE、IS_SHAREABLE三个字段记录游标的相关状态:
| 字段名 | 含义 |
|---|---|
| IS_BIND_SENSITIVE | 游标是否对绑定变量敏感,值为Y表示Oracle会监控该游标的绑定变量变化 |
| IS_BIND_AWARE | 游标是否已经启用自适应游标共享,值为Y表示会根据绑定变量动态调整执行计划 |
| IS_SHAREABLE | 游标是否可被共享复用,值为Y表示当前子游标可被新的执行请求使用 |
实际验证示例
我们可以通过以下示例直观看到自适应游标共享的效果,首先创建测试表和索引:
-- 创建测试表
CREATE TABLE test_acs (
id NUMBER,
name VARCHAR2(50),
status VARCHAR2(10)
);
-- 插入测试数据,status字段大量值为'N',少量值为'Y'
BEGIN
FOR i IN 1..100000 LOOP
INSERT INTO test_acs VALUES(i, 'test_' || i, 'N');
END LOOP;
FOR i IN 1..100 LOOP
INSERT INTO test_acs VALUES(100000 + i, 'test_' || (100000 + i), 'Y');
END LOOP;
COMMIT;
END;
/
-- 在status字段创建索引
CREATE INDEX idx_test_acs_status ON test_acs(status);然后执行带绑定变量的查询,先传入选择性高的绑定变量值'Y':
-- 第一次执行,绑定变量值为选择性高的'Y' VARIABLE v_status VARCHAR2(10); EXEC :v_status := 'Y'; SELECT * FROM test_acs WHERE status = :v_status;
再执行传入选择性低的绑定变量值'N'的查询:
-- 第二次执行,绑定变量值为选择性低的'N' EXEC :v_status := 'N'; SELECT * FROM test_acs WHERE status = :v_status;
之后查询V$SQL视图查看游标状态:
SELECT sql_id, child_number, is_bind_sensitive, is_bind_aware, is_shareable FROM v$sql WHERE sql_text LIKE 'SELECT * FROM test_acs WHERE status = :v_status%';
如果自适应游标共享生效,会看到该SQL对应多个子游标,且IS_BIND_AWARE字段为Y,说明Oracle已经为不同的绑定变量值适配了不同的执行计划。
使用注意事项
自适应游标共享虽然能优化SQL执行效率,但也不是所有场景都适用:
- 如果SQL的绑定变量值选择性差异很小,开启该特性反而会增加游标管理的开销,不建议强制启用。
- 可以通过设置
_optimizer_adaptive_cursor_sharing参数控制该特性的开关,默认是开启状态,生产环境不建议随意修改该参数。 - 如果发现大量不必要的子游标生成,可以通过绑定变量窥探相关的参数调整,或者改写SQL避免绑定变量选择性差异过大的场景。
总的来说,Oracle自适应游标共享是平衡硬解析开销和执行计划适配性的重要特性,理解其原理和判断机制,能帮助我们在实际场景中更好地优化SQL性能,避免因为固定执行计划导致的性能波动问题。
Oracleadaptive_cursor_sharingSQL优化游标共享修改时间:2026-06-01 23:04:21