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;
相关文章
|
6月前
|
SQL 运维 监控
SQL查询太慢?实战讲解YashanDB SQL调优思路
本文是Meetup第十期“调优实战专场”的第二篇技术文章,上一篇《高效查询秘诀,解码YashanDB优化器分组查询优化手段》中,我们揭秘了YashanDB分组查询优化秘诀,本文将通过一个案例,助你快速上手YashanDB慢日志功能,精准定位“慢SQL”后进行优化。
|
5月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
5月前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
6月前
|
SQL
【YashanDB知识库】使用leading hint调整SQL执行计划后报错YAS-04522 invalid hint leading
【YashanDB知识库】使用leading hint调整SQL执行计划后报错YAS-04522 invalid hint leading
【YashanDB知识库】使用leading hint调整SQL执行计划后报错YAS-04522 invalid hint leading
|
7月前
|
SQL
【YashanDB 知识库】使用 leading hint 调整 SQL 执行计划后报错 YAS-04522 invalid hint leading
在 YashanDB 的所有版本中,使用 leading hint 调整 SQL 执行计划时可能出现“YAS-04522 invalid hint leading”错误,导致 SQL 无法正常执行。原因是 YashanDB 优化器的 Bug。解决方法为避免使用 leading hint。可通过创建测试表 a、b、c 并执行特定 SQL 语句来验证问题是否存在。
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
1435 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
11月前
|
SQL Oracle 关系型数据库
Oracle SQL:了解执行计划和性能调优
Oracle SQL:了解执行计划和性能调优
234 1
|
SQL 分布式计算 数据库
SQL调优总结
数据库表的规范化和反规范化设计,设计合适的字段数据类型……
129 8
|
12月前
|
关系型数据库 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)")
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
409 13