1. 首页 > Oracle教程 > 正文

Oracle教程FG329-绑定感知窥视

本文档风哥主要介绍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手动干预
  • 适用于复杂场景:特别适合数据分布不均匀的表
风哥提示:绑定感知窥视是Oracle数据库优化的重要特性,通过智能的绑定变量处理机制,可以显著提高SQL执行性能,特别是对于数据分布不均匀的表。

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执行计划的选择情况
  • 调整参数:根据实际情况调整相关参数
  • 测试验证:在生产环境实施前进行充分测试
生产环境建议:绑定感知窥视规划应基于SQL语句特征和数据分布情况,合理配置相关参数,定期监控和优化,确保SQL执行性能最优。学习交流加群风哥微信: itpux-com

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计划基线捕获
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

风哥提示:定期监控绑定感知窥视的执行情况,及时发现和处理问题,确保SQL执行性能最优。学习交流加群风哥QQ113257174

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执行性能稳定
– 执行计划选择正确

生产环境建议:定期收集表统计信息,确保绑定感知窥视基于准确的统计信息做出正确的执行计划选择。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 绑定感知窥视管理经验

Oracle数据库绑定感知窥视管理经验:

  • 启用自适应优化:确保OPTIMIZER_ADAPTIVE_FEATURES参数设置为TRUE
  • 使用绑定变量:确保SQL语句使用绑定变量
  • 定期收集统计信息:确保统计信息准确
  • 监控绑定感知游标:定期监控绑定感知游标情况
  • 分析执行计划:确保执行计划选择正确
  • 调整参数:根据实际情况调整相关参数
  • 测试验证:在生产环境实施前进行充分测试
  • 持续优化:根据实际执行情况持续优化
风哥提示:绑定感知窥视是Oracle数据库优化的重要特性,通过智能的绑定变量处理机制,可以显著提高SQL执行性能,特别是对于数据分布不均匀的表。from oracle:www.itpux.com

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执行性能
持续改进:绑定感知窥视管理是一个持续的过程,需要定期review和优化。建议建立绑定感知窥视管理的规范和流程,不断改进SQL执行性能。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息