OBCP第四章 SQL调优-Hint

简介: OBCP第四章 SQL调优-Hint

Hint及特点

基于代价的优化器,与Oracle的Hint类似


如果使用MySQL的客户端执行带Hint的SQL语句,需要使用-c选项登陆,否则MySQL客户端会将Hint作为注释从用户SQL中去除,导致系统无法收到用户Hint


如果server端不认识SQL语句中的Hint,直接忽略而不报错


Hint只影响数据库优化器生成计划的逻辑,而不影响SQL语句本身的语义

OceanBase支持的hint有以下几个特点:

不带参数的,如/*+ FUNC */


带参数的,如/*+ FUNC(param) */


多个hint可以写到同一个注释中,用逗号分隔,如/*+ FUNC1, FUNC2(param) */


SELECT语句的hint必须近接在关键字SELECT之后,其他词之前。如:SELECT /*+ FUNC */ …


UPDATE, DELETE语句的hint必须紧接在关键字UPDATE,DELETE之后

Hint举例

强一致/弱一致:/*+READ_CONSISTENCY(STRONG)*/, /*+READ_CONSISTENCY(WEAK)*/


Server端执行语句超时时间:/*+query_timeout(100000000)*/ 单位微秒


采用sort-merge连接:/*+USE_MERGE(表名1 表名2)*/


强制使用索引:/*+INDEX(表名 索引名) */


采用并行:/*+PARALLEL(N)*/指定语句级别的并发度。


   当该hint指定时,会忽略系统变ob_stmt_parallel_degree的设置


/*+ leading(table_name_list)*/


指定表的连接顺序


如果发现hint指定的table_name不存在,leading hint失效;


如果发现hint中存在重复table,leading hint失效

Hint的行为理念及当前支持的Hint

Hint是为了告诉优化器考虑hint中的方式 , 其它数据库的行为更像贪心算法,不会考虑全部可能的路径最优,hint的指定的方式就是为了告诉数据库加入到它的考虑范围


OB优化器更像是动态规划,已经考虑了所有可能,因此hint告诉数据库加入到考虑范围就没有什么意义。基于这种情况,OB的hint更多是告诉优化器按照指定行为做


语句级别hint:MAX_CONCURRENT型,FROZEN_VERSION,QUERY_TIMEOUT,READ_CONSISTENCY,LOG_LEVEL,QB_NAME,ACTIVATE_BURIED_POINT,TRACE_LOG


计划相关hint:FULL,INDEX,LEADING,USE_MERGE,USE_HASH,USE_NL,ORDERED,NO_REWRITE

查询限流的例子

Hint中使用max_concurrent

?表示需要参数化的参数

OceanBase (root@oceanbase)> create table t1(a int primary key, b int, c int);
Query OK, 0 rows affected (0.15 sec)
OceanBase (root@oceanbase)> create outline ol_1 on select/*+max_concurrent(0)*/ * from 
t1 where b =1 and c = 1;
Query OK, 0 rows affected (0.06 sec)
OceanBase (root@oceanbase)> select * from t1 where b =1 and c = 1;
ERROR 5268 (HY000): SQL reach max concurrent num 0
OceanBase (root@oceanbase)> select * from t1 where b =1 and c = 2;
Empty set (0.01 sec)
OceanBase (root@oceanbase)> create outline ol_2 on select/*+max_concurrent(0)*/ * from 
t1 where b =1 and c = ?;
Query OK, 0 rows affected (0.05 sec)
OceanBase (root@oceanbase)> select * from t1 where b =1 and c = 1;
ERROR 5268 (HY000): SQL reach max concurrent num 0
OceanBase (root@oceanbase)> select * from t1 where b =1 and c = 2;
ERROR 5268 (HY000): SQL reach max concurrent num 0

执行计划绑定-Outline创建和删除


对于已上线的业务,如果出现优化器选择的计划不够优化时,则需要在线进行计划绑定,即无需业务进行 SQL 更改,而是通过 DDL 操作将一组 Hint 加入到 SQL 中,从而使优化器根据指定的一组 Hint,对该 SQL 生成更优计划。该组


Hint 称为 Outline。


创建 Outline

使用 SQL_TEXT 创建 Outline

CREATE [OR REPLACE] OUTLINE <outline_name> ON <stmt> [TO <target_stmt>];

使用 SQL_ID 创建 Outline

CREATE OUTLINE outline_name ON sql_id USING HINT hint_text;

删除Outline

DROP OUTLINE outline_name;

执行计划绑定-确定 Outline 创建生效

确定 Outline 创建生效

确定 Outline 创建成功

SELECT * FROM oceanbase.gv$outline WHERE OUTLINE_NAME = 'outline_name';

确定新的 SQL 是否通过绑定的 Outline 生成了新执行计划

SELECT SQL_ID, PLAN_ID, STATEMENT, OUTLINE_ID, OUTLINE_DATA 
FROM oceanbase.gv$plan_cache_plan_stat 
WHERE STATEMENT LIKE '%sql_text%';

确定生成的执行计划是否符合预期

SELECT OPERATOR, NAME FROM oceanbase.gv$plan_cache_plan_explain 
WHERE TENANT_ID = tenant_id AND IP = 'IP_address' 
AND PORT = port_num AND PLAN_ID = plan_id;

执行计划管理

SQL Plan Management(SPM)是一种稳定执行计划、控制计划演进的机制,确保新生成的计划在经过验证后才能使用,保证计划性能朝好的方向不断更新。SPM 基于 SQL Plan Baseline 实现,SQL Plan Baseline 是执行计划的一个基线,用于持久化存储已经验证过的执行计划信息(Outline Data 等信息),每个执行计划可对应一个 Plan Baseline,通过该 Plan Baseline 可复现一个执行计划。

SPM 机制包含如下过程:

计划捕获

对于新生成的计划,如果 SQL Plan Baseline 为空,则直接加入 SQL Plan Baseline,否则通过演进验证新生成计划比 SQL Plan Baseline 中计划性能更优后加入 SQL Plan Baseline,并删除旧的 Plan Baseline。

计划演进

如果相同 SQL 新捕获的计划和 SQL Plan Baseline 中的计划不一样,则通过流量灰度验证新计划的性能是否比以前验证过的计划更优。如果更优,则将新计划加入 SQL Plan Baseline,并执行新计划,否则仍使用旧计划。

计划选择。

在优化器新生成计划时,会查看SQL Plan Baseline是否有已验证的计划,如果有,则优先使用已验证计划,新计划需要通过演进验证后再使用。

执行计划管理-DBMS_SPM系统包

DBMS_SPM 是操作 SPM 的命令包,可支持加载、更改以及删除 Plan Baseline 信息


LOAD_PLANS_FROM_CURSOR_CACHE


LOAD_PLANS_FROM_CURSOR_CACHE 用于将 Plan Cache 中执行计划对应的 Plan Baseline 信息加载到__all_tenant_plan_baseline 表中。

DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE (
sql_id IN VARCHAR2,
plan_hash_value IN NUMBER := NULL,
fixed IN VARCHAR2 := 'NO',
enabled IN VARCHAR2 := 'YES')
RETURN PLS_INTEGER;

ALTER_SQL_PLAN_BASELINE

ALTER_SQL_PLAN_BASELINE 用于修改 Plan Baseline 中某些属性。

DBMS_SPM.ALTER_SQL_PLAN_BASELINE ( 
sql_handle IN VARCHAR2 := NULL,
plan_name IN VARCHAR2 := NULL,
attribute_name IN VARCHAR2,
attribute_value IN VARCHAR2)
RETURN PLS_INTEGER;

DROP_SQL_PLAN_BASELINE

DROP_SQL_PLAN_BASELINE 用于删掉某个 Plan Baseline。

DBMS_SPM.DROP_SQL_PLAN_BASELINE (
sql_handle IN VARCHAR2:= NULL,
plan_name IN VARCHAR2:= NULL)
RETURN PLS_INTEGER;
相关文章
|
3月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
644 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
2月前
|
SQL Oracle 关系型数据库
Oracle SQL:了解执行计划和性能调优
Oracle SQL:了解执行计划和性能调优
76 1
|
3月前
|
SQL 分布式计算 数据库
SQL调优总结
数据库表的规范化和反规范化设计,设计合适的字段数据类型……
49 8
|
4月前
|
Java XML Maven
跨越时代的飞跃:Struts 2 升级秘籍——从旧版本无缝迁移到最新版,焕发应用新生!
【8月更文挑战第31天】随着软件技术的发展,Struts 2 框架也在不断更新。本文通过具体案例指导开发者如何从旧版平滑升级到 Struts 2.6.x。首先更新 `pom.xml` 中的依赖版本,并执行 `mvn clean install`。接着检查 `struts.xml` 配置,确保符合新版本要求,调整包扫描器等设置。审查 Action 类及其注解,检查配置文件中的弃用项及插件。更新自定义拦截器实现,并验证日志配置。最后,通过一系列测试确保升级后的系统正常运行。通过这些步骤,可以顺利完成 Struts 2 的版本升级,提升应用的安全性和性能。
677 0
|
4月前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`&lt;s:checkbox&gt;`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
96 0
|
4月前
|
SQL 监控 关系型数据库
SQL性能监控与调优工具的神奇之处:如何用最佳实践选择最适合你的那一个,让你的数据库飞起来?
【8月更文挑战第31天】在现代软件开发中,数据库性能监控与调优对应用稳定性至关重要。本文对比了数据库内置工具、第三方工具及云服务工具等几种常用SQL性能监控与调优工具,并通过示例代码展示了如何利用MySQL的EXPLAIN功能分析查询性能。选择最适合的工具需综合考虑功能需求、数据库类型及成本预算等因素。遵循了解工具功能、试用工具及定期维护工具等最佳实践,可帮助开发者更高效地管理和优化数据库性能,迎接未来软件开发中的挑战与机遇。
62 0
|
4月前
|
SQL 关系型数据库 MySQL
SQL性能调优的神奇之处:如何用优化技巧让你的数据库查询飞起来,实现秒级响应?
【8月更文挑战第31天】在现代软件开发中,数据库性能至关重要。本文通过一个实战案例,展示了从慢查询到秒级响应的全过程。通过对查询的详细分析与优化,包括创建索引、改进查询语句及数据类型选择等措施,最终显著提升了性能。文章还提供了示例代码及最佳实践建议,帮助读者掌握SQL性能调优的核心技巧。
264 0
|
3月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
5月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
135 13