背景介绍
在使用DRDS数据库的过程中,可能遇到某些SQL优化器生成的执行计划,并不是期望的结果,或者生成的计划并不是最优的,比如有些Join、Aggregate 函数可以下推到下层RDS执行的,但是并没有下推。OUTLINE功能提供了一种给SQL指定执行计划的方式,用户可以通过Hint的方式手工构建SQL的执行计划,并通过OUTLINE的方式指定SQL的执行计划为用户构建的执行计划。
使用说明
OUTLINE功能提供了CREATE,DROP,RESYNC,DISABLE,ENABLE,SHOW指令来创建和管理系统中的OUTLINE,下面对各个指令进行说明。
创建 OUTLINE
CREATE 指令用来创建OUTLINE,创建后默认生效。
CREATE OUTLINE name ON origin_stmt TO target_stmt
name 是指创建的outline名称
origin_stmt 是指用来匹配SQL语句。当SQL不含"?"变量时,匹配必须完全相同,为完全匹配模式;
当含有"?"变量时,SQL中不能包含常量,并将SQL格式化后来做匹配,为参数化匹配模式
target_stmt 是指用hint方式指定生成逻辑计划的语句
示例一:创建一个完全匹配的OUTLINE。
mysql> create outline t1 on select1 to select2;
Query OK,1 row affected (1.09 sec)
mysql>select1;
+------+
|? |
+------+
| 2|
+------+
可以看到执行的时候select 1语句被替换为select 2语句了。
示例二:创建一个参数化匹配的OUTLINE。
mysql> create outline t2 on select? to select/*+TDDL:slave()*/*from ms10 where c1=?;
Query OK,1 row affected (0.16 sec)
mysql> explain select1;
+----------------------------------------------------------------------------+
| LOGICAL PLAN |
+----------------------------------------------------------------------------+
|LogicalView(tables="01.ms10", sql="SELECT * FROM `ms10` WHERE (`c1` = ?)")|
|HitCache:false |
|UsingOutline: T2 |
+----------------------------------------------------------------------------+
删除 OUTLINE
DROP 指令用来删除指定的OUTLINE。
DROP OUTLINE name
name 是指删除的outline名称
重新同步 OUTLINE
由于DRDS 实例是由多台 Server 组成的,创建 OUTLINE 时,可能会出现同步到其他 Server 报 SYNC error,这时需要从新同步。
RESYNC OUTLINE name
name 是指需要同步的outline名称
停用指定 OUTLINE
DISABLE 指令用来停用指定的OUTLINE。
DISABLE OUTLINE name
name 是指定的outline名称
启用指定 OUTLINE
ENABLE 指令用来启用指定的OUTLINE。
ENABLE OUTLINE name
name 是指定的outline名称
显示系统中的 OUTLINES
SHOW 指令用来显示系统中的OUTLINES。
SHOW OUTLINES
约束
- 多语句不支持。
- GROUP BY,ORDER BY 不支持’?’绑定变量。
- 在参数化匹配模式下,origin_stmt 中不能含有常量。
- 在参数化匹配模式下,origin_stmt 和 target_stmt 中含有的绑定变量数必须相等。
- 在完全匹配模式下,target_stmt 中不能含有绑定变量。
- 创建OUTLINE时,origin_stmt 不能与系统中已经存在的相同。
- 创建OUTLINE时, target_stmt 语义必须正确,能正确生成执行计划。