OceanBase教程FG186-OceanBase执行计划绑定与固定实战
目录大纲
Part01-基础概念与理论知识
1.1 执行计划概述
执行计划是数据库执行SQL语句的具体步骤和方法,包括:
- 访问路径:如何访问表数据,如全表扫描、索引扫描等
- 连接方式:表连接的方法,如嵌套循环连接、哈希连接等
- 操作顺序:操作的执行顺序,如先过滤后连接
- 并行度:是否使用并行执行
- 资源使用:CPU、内存等资源的使用情况
1.2 执行计划绑定的概念
执行计划绑定是指将SQL语句与特定的执行计划关联起来,确保SQL语句总是使用绑定的执行计划。执行计划绑定的作用包括:
- 提高性能稳定性:避免执行计划波动导致的性能问题
- 优化查询性能:选择最优的执行计划
- 防止执行计划退化:避免统计信息变化导致的执行计划退化
- 简化性能调优:通过绑定执行计划,简化性能调优过程
1.3 执行计划固定的概念
执行计划固定是指将执行计划锁定,防止其被自动优化器修改。执行计划固定的作用包括:
- 确保执行计划稳定:防止执行计划被意外修改
- 保障生产环境稳定:在生产环境中确保SQL语句的执行计划稳定
- 便于问题排查:固定执行计划后,便于排查性能问题
Part02-执行计划绑定方法
,风哥提示:。
2.1 执行计划绑定的步骤
OceanBase执行计划绑定的基本步骤:
- 生成执行计划:执行SQL语句,生成执行计划
- 查看执行计划:使用EXPLAIN命令查看执行计划
- 选择最优执行计划:分析执行计划,选择最优的执行计划
- 绑定执行计划:使用DBMS_SPM包绑定执行计划
- 验证绑定结果:验证执行计划是否成功绑定
2.2 执行计划绑定的命令
OceanBase执行计划绑定的常用命令:
示例1:生成执行计划
EXPLAIN SELECT * FROM fgedu_table WHERE id = 100;
+—————————————–+
| Query Plan |
+—————————————–+
| ======================================= |
| |ID|OPERATOR |NAME|EST. ROWS|COST|
| ————————————— |
| |0 |TABLE SCAN |t1 |1 |1 |
| | |PREDICATES |id = 100|
| ======================================= |
+—————————————–+,学习交流加群风哥微信: itpux-com。
| Query Plan |
+—————————————–+
| ======================================= |
| |ID|OPERATOR |NAME|EST. ROWS|COST|
| ————————————— |
| |0 |TABLE SCAN |t1 |1 |1 |
| | |PREDICATES |id = 100|
| ======================================= |
+—————————————–+,学习交流加群风哥微信: itpux-com。
示例2:绑定执行计划
CALL DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
sql_id => 'sql_id_value',
plan_hash_value => plan_hash_value,
fixed => 'YES'
);
示例3:查看绑定的执行计划
SELECT * FROM DBA_SQL_PLAN_BASELINES;
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
| SQL_HANDLE | SQL_TEXT | PLAN_NAME | CREATED | LAST_MODIFIED | LAST_EXECUTED | ENABLED | ACCEPTED | FIXED | REPRODUCED |
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
| SQL_handle_value| SELECT * FROM | SQL_PLAN_name| 2024-01-01| 2024-01-01 | 2024-01-01 | YES | YES | YES | YES |
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
| SQL_HANDLE | SQL_TEXT | PLAN_NAME | CREATED | LAST_MODIFIED | LAST_EXECUTED | ENABLED | ACCEPTED | FIXED | REPRODUCED |
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
| SQL_handle_value| SELECT * FROM | SQL_PLAN_name| 2024-01-01| 2024-01-01 | 2024-01-01 | YES | YES | YES | YES |
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
2.3 执行计划绑定的注意事项
执行计划绑定的注意事项:
- SQL语句一致性:绑定的SQL语句必须与实际执行的SQL语句完全一致
- 执行计划有效性:绑定的执行计划必须是有效的,否则会导致执行失败
- 统计信息变化:当统计信息发生变化时,绑定的执行计划可能不再最优
- 系统参数变化:系统参数的变化可能影响执行计划的性能
- 定期检查:定期检查绑定的执行计划,确保其仍然最优
Part03-执行计划固定方法
3.1 执行计划固定的步骤
OceanBase执行计划固定的基本步骤:
- 生成执行计划:执行SQL语句,生成执行计划
- 查看执行计划:使用EXPLAIN命令查看执行计划
- 选择最优执行计划:分析执行计划,选择最优的执行计划
- 固定执行计划:使用DBMS_SPM包固定执行计划
- 验证固定结果:验证执行计划是否成功固定
,学习交流加群风哥QQ113257174。
3.2 执行计划固定的命令
OceanBase执行计划固定的常用命令:
示例1:固定执行计划
CALL DBMS_SPM.ALTER_SQL_PLAN_BASELINE(
sql_handle => 'sql_handle_value',
plan_name => 'plan_name_value',
attribute_name => 'FIXED',
attribute_value => 'YES'
);
示例2:取消固定执行计划
CALL DBMS_SPM.ALTER_SQL_PLAN_BASELINE(
sql_handle => 'sql_handle_value',
plan_name => 'plan_name_value',
attribute_name => 'FIXED',
attribute_value => 'NO'
);
示例3:删除执行计划
CALL DBMS_SPM.DROP_SQL_PLAN_BASELINE(
sql_handle => 'sql_handle_value',
plan_name => 'plan_name_value'
);
3.3 执行计划固定的注意事项
执行计划固定的注意事项:
- ,更多视频教程www.fgedu.net.cn。
- 执行计划选择:固定的执行计划必须是经过验证的最优执行计划
- 系统变化:当系统环境发生变化时,固定的执行计划可能不再最优
- 定期评估:定期评估固定的执行计划,确保其仍然适应系统变化
- 备份计划:保留多个执行计划,以便在需要时切换
- 监控性能:监控固定执行计划的性能,及时发现问题
Part04-实战案例与优化
4.1 执行计划绑定实战案例
案例1:优化查询性能
问题描述:某查询语句在执行时,执行计划不稳定,导致性能波动较大。
解决方案:绑定执行计划,确保查询使用最优的执行计划。
步骤:
- 执行SQL语句,查看执行计划:
- 创建索引:
- 再次执行SQL语句,查看执行计划:
- 绑定执行计划:
- 验证绑定结果:
- 执行SQL语句,查看执行计划:
- 绑定执行计划:
- 固定执行计划:
- 验证固定结果:
- 执行计划绑定失败:
- 检查SQL语句是否正确
- 检查执行计划是否有效
- 检查权限是否足够
- 执行计划性能下降:
- 重新生成执行计划
- 更新统计信息
- 调整绑定的执行计划
- 执行计划不生效:
- 检查SQL语句是否与绑定的语句完全一致
- 检查执行计划是否被启用
- 检查系统参数是否影响执行计划
- 执行计划管理混乱:
- 建立执行计划管理规范
- 定期清理无效的执行计划
- 建立执行计划版本管理
- 建立执行计划管理规范:制定执行计划绑定与固定的标准流程
- 定期评估执行计划:定期评估绑定的执行计划,确保其仍然最优
- 保留多个执行计划:为重要SQL语句保留多个执行计划,以便在需要时切换
- 监控执行计划性能:监控绑定执行计划的性能,及时发现问题
- 建立执行计划版本管理:记录执行计划的变更历史,便于回滚
- 选择合适的执行计划:根据数据分布和查询模式选择合适的执行计划
- 优化索引设计:为常用查询字段创建合适的索引
- 调整系统参数:根据系统负载调整相关参数
- 使用绑定变量:使用绑定变量减少SQL解析开销
- 定期收集统计信息:定期收集统计信息,确保执行计划生成准确
- 执行计划波动:
- 绑定执行计划
- 检查统计信息是否过期
- 检查系统参数是否变化
- 执行计划退化:
- 重新生成执行计划
- 更新统计信息
- 调整索引
- 执行计划不生效:
- 检查SQL语句是否一致
- 检查执行计划是否被启用
- 检查权限是否足够
- 性能下降:
- 分析执行计划
- 检查系统资源使用情况
- 调整执行计划
EXPLAIN SELECT * FROM fgedu_table WHERE status = ‘active’ AND create_time > ‘2024-01-01’;
+—————————————–+
| Query Plan |
+—————————————–+
| ======================================= |
| |ID|OPERATOR |NAME|EST. ROWS|COST|
| ————————————— |
| |0 |TABLE SCAN |t1 |1000 |1000|
| | |PREDICATES |status = ‘active’ AND create_time > ‘2024-01-01’|
| ======================================= |
| Query Plan |
+—————————————–+
| ======================================= |
| |ID|OPERATOR |NAME|EST. ROWS|COST|
| ————————————— |
| |0 |TABLE SCAN |t1 |1000 |1000|
| | |PREDICATES |status = ‘active’ AND create_time > ‘2024-01-01’|
| ======================================= |
CREATE INDEX idx_status_create_time ON fgedu_table(status, create_time);
Query OK, 0 rows affected
EXPLAIN SELECT * FROM fgedu_table WHERE status = ‘active’ AND create_time > ‘2024-01-01’;
+—————————————–+
| Query Plan |
+—————————————–+,更多学习教程公众号风哥教程itpux_com。
| ======================================= |
| |ID|OPERATOR |NAME|EST. ROWS|COST|
| ————————————— |
| |0 |INDEX RANGE SCAN|idx_status_create_time|1000|100|
| | |PREDICATES |status = ‘active’ AND create_time > ‘2024-01-01’|
| ======================================= |
| Query Plan |
+—————————————–+,更多学习教程公众号风哥教程itpux_com。
| ======================================= |
| |ID|OPERATOR |NAME|EST. ROWS|COST|
| ————————————— |
| |0 |INDEX RANGE SCAN|idx_status_create_time|1000|100|
| | |PREDICATES |status = ‘active’ AND create_time > ‘2024-01-01’|
| ======================================= |
CALL DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
sql_id => 'sql_id_value',
plan_hash_value => plan_hash_value,
fixed => 'YES'
);
Query OK, 0 rows affected
SELECT * FROM DBA_SQL_PLAN_BASELINES WHERE SQL_TEXT LIKE ‘%fgedu_table%’;
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
| SQL_HANDLE | SQL_TEXT | PLAN_NAME | CREATED | LAST_MODIFIED | LAST_EXECUTED | ENABLED | ACCEPTED | FIXED | REPRODUCED |
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
| SQL_handle_value| SELECT * FROM | SQL_PLAN_name| 2024-01-01| 2024-01-01 | 2024-01-01 | YES | YES | YES | YES |
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
| SQL_HANDLE | SQL_TEXT | PLAN_NAME | CREATED | LAST_MODIFIED | LAST_EXECUTED | ENABLED | ACCEPTED | FIXED | REPRODUCED |
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
| SQL_handle_value| SELECT * FROM | SQL_PLAN_name| 2024-01-01| 2024-01-01 | 2024-01-01 | YES | YES | YES | YES |
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
4.2 执行计划固定实战案例
案例2:保障生产环境稳定
问题描述:某生产系统中的关键SQL语句执行计划不稳定,导致系统性能波动。
,from DB视频:www.itpux.com。
解决方案:固定执行计划,确保SQL语句使用稳定的执行计划。
步骤:
EXPLAIN SELECT * FROM fgedu_orders WHERE order_date > ‘2024-01-01’ GROUP BY customer_id;
+—————————————–+
| Query Plan |
+—————————————–+
| ======================================= |
| |ID|OPERATOR |NAME|EST. ROWS|COST|
| ————————————— |
| |0 |HASH GROUP BY | |1000 |500 |
| |1 |TABLE SCAN |t1 |10000 |400 |
| | |PREDICATES |order_date > ‘2024-01-01’|
| ======================================= |
| Query Plan |
+—————————————–+
| ======================================= |
| |ID|OPERATOR |NAME|EST. ROWS|COST|
| ————————————— |
| |0 |HASH GROUP BY | |1000 |500 |
| |1 |TABLE SCAN |t1 |10000 |400 |
| | |PREDICATES |order_date > ‘2024-01-01’|
| ======================================= |
CALL DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
sql_id => 'sql_id_value',
plan_hash_value => plan_hash_value,
fixed => 'YES'
);
Query OK, 0 rows affected
CALL DBMS_SPM.ALTER_SQL_PLAN_BASELINE(
sql_handle => 'sql_handle_value',
plan_name => 'plan_name_value',
attribute_name => 'FIXED',
attribute_value => 'YES'
);
Query OK, 0 rows affected
SELECT * FROM DBA_SQL_PLAN_BASELINES WHERE SQL_TEXT LIKE ‘%fgedu_orders%’;
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
| SQL_HANDLE | SQL_TEXT | PLAN_NAME | CREATED | LAST_MODIFIED | LAST_EXECUTED | ENABLED | ACCEPTED | FIXED | REPRODUCED |
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
| SQL_handle_value| SELECT * FROM | SQL_PLAN_name| 2024-01-01| 2024-01-01 | 2024-01-01 | YES | YES | YES | YES |
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
| SQL_HANDLE | SQL_TEXT | PLAN_NAME | CREATED | LAST_MODIFIED | LAST_EXECUTED | ENABLED | ACCEPTED | FIXED | REPRODUCED |
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
| SQL_handle_value| SELECT * FROM | SQL_PLAN_name| 2024-01-01| 2024-01-01 | 2024-01-01 | YES | YES | YES | YES |
+—————-+—————-+————-+———-+—————-+—————-+—————-+—————-+—————-+—————-+
4.3 常见问题与解决方案
执行计划绑定与固定的常见问题与解决方案:
Part05-风哥经验总结与分享
5.1 执行计划管理最佳实践
执行计划管理的最佳实践:
5.2 性能优化经验
执行计划优化的经验:
5.3 常见问题处理技巧
执行计划相关问题的处理技巧:
风哥提示:执行计划绑定与固定是优化查询性能的重要手段,但需要定期评估和调整,以适应系统变化
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
