本文档风哥主要介绍Oracle数据库绑定感知窥视(Bind-Aware Peeking)相关知识,包括绑定感知窥视的概念、原理、优势、规划、配置、管理、监控、优化等内容,由风哥教程参考Oracle官方文档Performance内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 绑定感知窥视的概念
Oracle数据库绑定感知窥视(Bind-Aware Peeking)是一种智能的绑定变量处理机制,是自适应游标共享的核心组成部分。绑定感知窥视能够识别SQL语句对绑定变量值的敏感性,并根据不同的绑定变量值生成不同的执行计划,提高SQL执行性能。更多视频教程www.fgedu.net.cn
- 识别SQL语句对绑定变量值的敏感性
- 根据不同的绑定变量值生成不同的执行计划
- 智能判断是否共享游标
- 提高SQL执行性能
- 减少硬解析
1.2 绑定感知窥视的原理
Oracle数据库绑定感知窥视的原理:
- 绑定变量窥视:第一次执行SQL语句时,Oracle会窥视绑定变量的值,生成执行计划
- 执行计划评估:Oracle会评估执行计划的性能,记录执行统计信息
- 绑定变量值分类:根据绑定变量值的分布情况,将值分为不同的类别
- 绑定感知标记:将SQL语句标记为绑定感知(bind-aware)
- 执行计划选择:对于不同类别的绑定变量值,选择不同的执行计划
1.3 绑定感知窥视的优势
Oracle数据库绑定感知窥视的优势:
- 提高性能:为不同的绑定变量值选择最优的执行计划
- 减少硬解析:在合适的情况下共享游标,减少硬解析开销
- 智能适应:根据实际执行情况自动调整执行计划
- 无需人工干预:自动运行,无需DBA手动干预
- 适用于复杂场景:特别适合数据分布不均匀的表
Part02-生产环境规划与建议
2.1 绑定感知窥视规划
Oracle数据库绑定感知窥视规划要点:
1. 分析SQL语句特征
2. 识别数据分布不均匀的表
3. 评估绑定变量使用情况
4. 配置绑定感知窥视参数
5. 测试和验证
6. 监控和优化
# 适用场景
– 数据分布不均匀的表
– 使用绑定变量的SQL语句
– 同一SQL语句使用不同绑定变量值
– 不同绑定变量值需要不同执行计划的场景
# 不适用场景
– 数据分布均匀的表
– 不使用绑定变量的SQL语句
– 绑定变量值范围很小的场景
– 简单查询(执行计划选择有限)
2.2 绑定感知窥视设计
Oracle数据库绑定感知窥视设计建议:
– 基于SQL语句特征设计
– 基于数据分布设计
– 基于绑定变量使用情况设计
– 最小化硬解析
– 最大化执行计划质量
# 参数配置
– OPTIMIZER_ADAPTIVE_FEATURES:启用或禁用自适应优化特性
– OPTIMIZER_ADAPTIVE_REPORTING_ONLY:仅报告不实际使用
– CURSOR_SHARING:控制游标共享行为
# 设计步骤
1. 识别需要绑定感知窥视的SQL语句
2. 分析数据分布情况
3. 配置相关参数
4. 测试执行计划选择
5. 监控性能效果
2.3 绑定感知窥视最佳实践
Oracle数据库绑定感知窥视最佳实践:
- 启用自适应优化:确保OPTIMIZER_ADAPTIVE_FEATURES参数设置为TRUE
- 使用绑定变量:确保SQL语句使用绑定变量
- 分析数据分布:了解表的数据分布情况
- 定期收集统计信息:确保统计信息准确
- 监控执行计划:定期监控SQL执行计划的选择情况
- 调整参数:根据实际情况调整相关参数
- 测试验证:在生产环境实施前进行充分测试
Part03-生产环境项目实施方案
3.1 绑定感知窥视配置
3.1.1 启用绑定感知窥视
SQL> SHOW PARAMETER optimizer_adaptive_features;
NAME TYPE VALUE
———————————— ———– ——————————
optimizer_adaptive_features boolean TRUE
# 启用绑定感知窥视
SQL> ALTER SYSTEM SET optimizer_adaptive_features = TRUE SCOPE=BOTH;
System altered.
# 查看游标共享设置
SQL> SHOW PARAMETER cursor_sharing;
NAME TYPE VALUE
———————————— ———– ——————————
cursor_sharing string EXACT
3.1.2 配置SQL计划基线
SQL> ALTER SYSTEM SET optimizer_capture_sql_plan_baselines = TRUE SCOPE=BOTH;
System altered.
# 手动加载SQL计划基线
SQL> EXEC DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id => ‘abc123’);
PL/SQL procedure successfully completed.
# 查看SQL计划基线
SQL> SELECT
sql_handle,
plan_name,
enabled,
accepted
FROM dba_sql_plan_baselines;
SQL_HANDLE PLAN_NAME ENA ACC
—————————— —————————— — —
SQL_1234567890abcdef SQL_PLAN_1234567890abcdef0001 YES YES
3.2 绑定感知窥视管理
3.2.1 管理绑定感知游标
SQL> SELECT
sql_id,
child_number,
executions,
buffer_gets,
rows_processed,
plan_hash_value,
is_bind_sensitive,
is_bind_aware,
is_shareable
FROM v$sql
WHERE is_bind_aware = ‘YES’;
SQL_ID CHILD_NUMBER EXECUTIONS BUFFER_GETS ROWS_PROCESSED PLAN_HASH_VALUE IS_BIND_SENSITIVE IS_BIND_AWARE IS_SHAREABLE
————- ———— ———- ———– ————– ————— —————- ————- ————
abcd1234 0 100 1000 100 1234567890 YES YES YES
abcd1234 1 50 500 1000 9876543210 YES YES YES
# 查看绑定变量信息
SQL> SELECT
sql_id,
child_number,
bind_position,
datatype_string,
value_string
FROM v$sql_bind_capture
WHERE sql_id = ‘abcd1234’;
SQL_ID CHILD_NUMBER BIND_POSITION DATATYPE_STRING VALUE_STRING
————- ———— ————- ————— ————
abcd1234 0 1 NUMBER 10
abcd1234 1 1 NUMBER 20
3.2.2 处理绑定感知问题
SQL> ALTER SYSTEM FLUSH SHARED_POOL;
System altered.
# 清除特定SQL的游标
SQL> EXEC DBMS_SHARED_POOL.PURGE(‘00000003C9A12345, 0’, ‘C’);
PL/SQL procedure successfully completed.
# 使用提示强制不同的执行计划
SQL> SELECT /*+ FULL(employees) */ * FROM employees WHERE department_id = :dept;
3.3 绑定感知窥视监控
3.3.1 监控绑定感知窥视
SQL> SELECT
sql_id,
child_number,
executions,
buffer_gets,
rows_processed,
plan_hash_value,
is_bind_sensitive,
is_bind_aware,
is_shareable
FROM v$sql
WHERE sql_text LIKE ‘%SELECT * FROM employees WHERE department_id = :dept%’;
SQL_ID CHILD_NUMBER EXECUTIONS BUFFER_GETS ROWS_PROCESSED PLAN_HASH_VALUE IS_BIND_SENSITIVE IS_BIND_AWARE IS_SHAREABLE
————- ———— ———- ———– ————– ————— —————- ————- ————
abcd1234 0 100 1000 100 1234567890 YES YES YES
abcd1234 1 50 500 1000 9876543210 YES YES YES
# 查看绑定变量窥视情况
SQL> SELECT
sql_id,
child_number,
bind_position,
datatype_string,
value_string
FROM v$sql_bind_capture
WHERE sql_id = ‘abcd1234’;
SQL_ID CHILD_NUMBER BIND_POSITION DATATYPE_STRING VALUE_STRING
————- ———— ————- ————— ————
abcd1234 0 1 NUMBER 10
abcd1234 1 1 NUMBER 20
# 监控执行计划性能
SQL> SELECT
sql_id,
plan_hash_value,
executions,
elapsed_time/1000000 AS elapsed_seconds,
buffer_gets,
rows_processed
FROM v$sql
WHERE sql_id = ‘abcd1234’;
SQL_ID PLAN_HASH_VALUE EXECUTIONS ELAPSED_SECONDS BUFFER_GETS ROWS_PROCESSED
————- ————— ———- ————— ———– ————–
abcd1234 1234567890 100 0.1 1000 100
abcd1234 9876543210 50 0.2 500 1000
Part04-生产案例与实战讲解
4.1 绑定感知窥视实施案例
在某企业的生产环境中,存在一个数据分布不均匀的表,需要实施绑定感知窥视来提高SQL执行性能。
– 表名:employees
– 数据分布:department_id为10的部门有100条记录,department_id为20的部门有1000条记录
– SQL语句:SELECT * FROM employees WHERE department_id = :dept
– 问题:使用相同的执行计划,导致性能不一致
# 实施方案
1. 检查当前绑定感知窥视设置
SQL> SHOW PARAMETER optimizer_adaptive_features;
NAME TYPE VALUE
———————————— ———– ——————————
optimizer_adaptive_features boolean TRUE
2. 执行SQL语句,使用不同的绑定变量值
# 使用department_id=10
SQL> VARIABLE dept NUMBER;
SQL> EXEC :dept := 10;
SQL> SELECT * FROM employees WHERE department_id = :dept;
# 使用department_id=20
SQL> EXEC :dept := 20;
SQL> SELECT * FROM employees WHERE department_id = :dept;
3. 查看绑定感知游标
SQL> SELECT
sql_id,
child_number,
executions,
buffer_gets,
rows_processed,
plan_hash_value,
is_bind_sensitive,
is_bind_aware,
is_shareable
FROM v$sql
WHERE sql_text LIKE ‘%SELECT * FROM employees WHERE department_id = :dept%’;
SQL_ID CHILD_NUMBER EXECUTIONS BUFFER_GETS ROWS_PROCESSED PLAN_HASH_VALUE IS_BIND_SENSITIVE IS_BIND_AWARE IS_SHAREABLE
————- ———— ———- ———– ————– ————— —————- ————- ————
abcd1234 0 100 1000 100 1234567890 YES YES YES
abcd1234 1 50 500 1000 9876543210 YES YES YES
4. 查看执行计划
# 查看第一个子游标的执行计划
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(‘abcd1234’, 0));
PLAN_TABLE_OUTPUT
——————————————————————–
SQL_ID abcd1234, child number 0
———————————
SELECT * FROM employees WHERE department_id = :dept
Plan hash value: 1234567890
——————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost |
——————————————————————–
| 0 | SELECT STATEMENT | | | | 2 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 100 | 7800 | 2 |
|* 2 | INDEX RANGE SCAN | EMP_DEPT_IDX | 100 | | 1 |
——————————————————————–
# 查看第二个子游标的执行计划
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(‘abcd1234’, 1));
PLAN_TABLE_OUTPUT
——————————————————————–
SQL_ID abcd1234, child number 1
———————————
SELECT * FROM employees WHERE department_id = :dept
Plan hash value: 9876543210
——————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost |
——————————————————————–
| 0 | SELECT STATEMENT | | | | 5 |
| 1 | TABLE ACCESS FULL| EMPLOYEES | 1000 | 78000 | 5 |
——————————————————————–
# 实施效果
– department_id=10时使用索引范围扫描,执行计划成本低
– department_id=20时使用全表扫描,执行计划成本低
– 绑定感知窥视成功为不同的绑定变量值选择了最优的执行计划
– SQL执行性能显著提高
4.2 绑定感知窥视优化案例
在某金融机构的生产环境中,需要优化绑定感知窥视配置,提高SQL执行性能。
– 表名:transactions
– 数据分布:status为’PENDING’的记录有100条,status为’COMPLETED’的记录有100000条
– SQL语句:SELECT * FROM transactions WHERE status = :status
– 问题:绑定感知窥视未生效,导致性能问题
# 优化方案
1. 检查当前绑定感知窥视设置
SQL> SHOW PARAMETER optimizer_adaptive_features;
NAME TYPE VALUE
———————————— ———– ——————————
optimizer_adaptive_features boolean FALSE
2. 启用绑定感知窥视
SQL> ALTER SYSTEM SET optimizer_adaptive_features = TRUE SCOPE=BOTH;
System altered.
3. 收集表统计信息
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(‘SCOTT’, ‘TRANSACTIONS’);
PL/SQL procedure successfully completed.
4. 执行SQL语句,使用不同的绑定变量值
# 使用status=’PENDING’
SQL> VARIABLE status VARCHAR2(20);
SQL> EXEC :status := ‘PENDING’;
SQL> SELECT * FROM transactions WHERE status = :status;
# 使用status=’COMPLETED’
SQL> EXEC :status := ‘COMPLETED’;
SQL> SELECT * FROM transactions WHERE status = :status;
5. 查看绑定感知游标
SQL> SELECT
sql_id,
child_number,
executions,
buffer_gets,
rows_processed,
plan_hash_value,
is_bind_sensitive,
is_bind_aware,
is_shareable
FROM v$sql
WHERE sql_text LIKE ‘%SELECT * FROM transactions WHERE status = :status%’;
SQL_ID CHILD_NUMBER EXECUTIONS BUFFER_GETS ROWS_PROCESSED PLAN_HASH_VALUE IS_BIND_SENSITIVE IS_BIND_AWARE IS_SHAREABLE
————- ———— ———- ———– ————– ————— —————- ————- ————
xyz7890 0 50 100 100 1122334455 YES YES YES
xyz7890 1 20 10000 100000 5544332211 YES YES YES
6. 查看执行计划
# 查看第一个子游标的执行计划
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(‘xyz7890’, 0));
PLAN_TABLE_OUTPUT
——————————————————————–
SQL_ID xyz7890, child number 0
———————————
SELECT * FROM transactions WHERE status = :status
Plan hash value: 1122334455
——————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost |
——————————————————————–
| 0 | SELECT STATEMENT | | | | 2 |
| 1 | TABLE ACCESS BY INDEX ROWID| TRANSACTIONS | 100 | 5000 | 2 |
|* 2 | INDEX RANGE SCAN | TRANS_STATUS_IDX | 100 | | 1 |
——————————————————————–
# 查看第二个子游标的执行计划
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(‘xyz7890’, 1));
PLAN_TABLE_OUTPUT
——————————————————————–
SQL_ID xyz7890, child number 1
———————————
SELECT * FROM transactions WHERE status = :status
Plan hash value: 5544332211
——————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost |
——————————————————————–
| 0 | SELECT STATEMENT | | | | 100 |
| 1 | TABLE ACCESS FULL| TRANSACTIONS | 100000| 5000000 | 100 |
——————————————————————–
# 优化效果
– status=’PENDING’时使用索引范围扫描,执行计划成本低
– status=’COMPLETED’时使用全表扫描,执行计划成本低
– 绑定感知窥视成功为不同的绑定变量值选择了最优的执行计划
– SQL执行性能提高50%
4.3 绑定感知窥视问题处理
在某电商网站的生产环境中,绑定感知窥视出现问题,导致SQL执行性能下降。
– SQL语句执行性能不稳定
– 同一SQL语句有时快有时慢
– 绑定感知窥视未正确选择执行计划
# 分析步骤
1. 检查绑定感知窥视设置
SQL> SHOW PARAMETER optimizer_adaptive_features;
NAME TYPE VALUE
———————————— ———– ——————————
optimizer_adaptive_features boolean TRUE
2. 查看绑定感知游标
SQL> SELECT
sql_id,
child_number,
executions,
buffer_gets,
rows_processed,
plan_hash_value,
is_bind_sensitive,
is_bind_aware,
is_shareable
FROM v$sql
WHERE sql_text LIKE ‘%SELECT * FROM orders WHERE customer_id = :cust%’;
SQL_ID CHILD_NUMBER EXECUTIONS BUFFER_GETS ROWS_PROCESSED PLAN_HASH_VALUE IS_BIND_SENSITIVE IS_BIND_AWARE IS_SHAREABLE
————- ———— ———- ———– ————– ————— —————- ————- ————
pqr4567 0 200 50000 10000 9988776655 YES YES YES
3. 查看执行计划
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(‘pqr4567’, 0));
PLAN_TABLE_OUTPUT
——————————————————————–
SQL_ID pqr4567, child number 0
———————————
SELECT * FROM orders WHERE customer_id = :cust
Plan hash value: 9988776655
——————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost |
——————————————————————–
| 0 | SELECT STATEMENT | | | | 500 |
| 1 | TABLE ACCESS FULL| ORDERS | 10000 | 500000 | 500 |
——————————————————————–
4. 检查表统计信息
SQL> SELECT
table_name,
last_analyzed
FROM dba_tables
WHERE table_name = ‘ORDERS’;
TABLE_NAME LAST_ANALYZED
—————————— ——————-
ORDERS 2026-01-01 00:00:00
# 问题原因
– 表统计信息过时
– 绑定感知窥视基于过时的统计信息做出了错误的执行计划选择
– 对于所有绑定变量值都使用了全表扫描
# 解决方案
1. 收集表统计信息
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(‘SCOTT’, ‘ORDERS’);
PL/SQL procedure successfully completed.
2. 清除共享池中的游标
SQL> ALTER SYSTEM FLUSH SHARED_POOL;
System altered.
3. 重新执行SQL语句,使用不同的绑定变量值
# 使用customer_id=100(少量订单)
SQL> VARIABLE cust NUMBER;
SQL> EXEC :cust := 100;
SQL> SELECT * FROM orders WHERE customer_id = :cust;
# 使用customer_id=200(大量订单)
SQL> EXEC :cust := 200;
SQL> SELECT * FROM orders WHERE customer_id = :cust;
4. 查看绑定感知游标
SQL> SELECT
sql_id,
child_number,
executions,
buffer_gets,
rows_processed,
plan_hash_value,
is_bind_sensitive,
is_bind_aware,
is_shareable
FROM v$sql
WHERE sql_text LIKE ‘%SELECT * FROM orders WHERE customer_id = :cust%’;
SQL_ID CHILD_NUMBER EXECUTIONS BUFFER_GETS ROWS_PROCESSED PLAN_HASH_VALUE IS_BIND_SENSITIVE IS_BIND_AWARE IS_SHAREABLE
————- ———— ———- ———– ————– ————— —————- ————- ————
pqr4567 0 50 100 10 1122334455 YES YES YES
pqr4567 1 20 10000 10000 9988776655 YES YES YES
5. 查看执行计划
# 查看第一个子游标的执行计划
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(‘pqr4567’, 0));
PLAN_TABLE_OUTPUT
——————————————————————–
SQL_ID pqr4567, child number 0
———————————
SELECT * FROM orders WHERE customer_id = :cust
Plan hash value: 1122334455
——————————————————————–
| Id | Operation | Name | Rows | Bytes | Cost |
——————————————————————–
| 0 | SELECT STATEMENT | | | | 2 |
| 1 | TABLE ACCESS BY INDEX ROWID| ORDERS | 10 | 500 | 2 |
|* 2 | INDEX RANGE SCAN | ORD_CUST_IDX | 10 | | 1 |
——————————————————————–
# 解决效果
– 绑定感知窥视现在为不同的绑定变量值选择了最优的执行计划
– SQL执行性能稳定
– 执行计划选择正确
Part05-风哥经验总结与分享
5.1 绑定感知窥视管理经验
Oracle数据库绑定感知窥视管理经验:
- 启用自适应优化:确保OPTIMIZER_ADAPTIVE_FEATURES参数设置为TRUE
- 使用绑定变量:确保SQL语句使用绑定变量
- 定期收集统计信息:确保统计信息准确
- 监控绑定感知游标:定期监控绑定感知游标情况
- 分析执行计划:确保执行计划选择正确
- 调整参数:根据实际情况调整相关参数
- 测试验证:在生产环境实施前进行充分测试
- 持续优化:根据实际执行情况持续优化
5.2 绑定感知窥视检查清单
– [ ] 启用自适应优化(OPTIMIZER_ADAPTIVE_FEATURES=TRUE)
– [ ] 确保SQL语句使用绑定变量
– [ ] 定期收集表统计信息
– [ ] 监控绑定感知游标情况
– [ ] 分析执行计划选择
– [ ] 处理绑定感知问题
– [ ] 测试不同绑定变量值的执行计划
– [ ] 调整相关参数
– [ ] 验证执行性能
– [ ] 持续优化
# 绑定感知窥视问题处理流程
1. 发现SQL执行性能问题
2. 检查绑定感知窥视设置
3. 查看绑定感知游标情况
4. 分析执行计划选择
5. 检查统计信息
6. 制定解决方案
7. 实施解决方案
8. 验证问题解决
9. 总结经验,优化配置
5.3 绑定感知窥视管理工具
Oracle数据库绑定感知窥视管理常用工具:
- v$sql:查看绑定感知游标情况
- v$sql_bind_capture:查看绑定变量信息
- DBMS_XPLAN.DISPLAY_CURSOR:查看执行计划
- DBMS_STATS:收集统计信息
- ALTER SYSTEM FLUSH SHARED_POOL:清除共享池
- DBMS_SHARED_POOL.PURGE:清除特定游标
- Oracle Enterprise Manager:图形化监控和管理
- AWR报告:分析SQL执行性能
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
