背景介绍
在使用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_stmtname 是指创建的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 namename 是指删除的outline名称
重新同步 OUTLINE
由于DRDS 实例是由多台 Server 组成的,创建 OUTLINE 时,可能会出现同步到其他 Server 报 SYNC error,这时需要从新同步。
RESYNC OUTLINE namename 是指需要同步的outline名称
停用指定 OUTLINE
DISABLE 指令用来停用指定的OUTLINE。
DISABLE OUTLINE namename 是指定的outline名称
启用指定 OUTLINE
ENABLE 指令用来启用指定的OUTLINE。
ENABLE OUTLINE namename 是指定的outline名称
显示系统中的 OUTLINES
SHOW 指令用来显示系统中的OUTLINES。
SHOW OUTLINES
约束
- 多语句不支持。
- GROUP BY,ORDER BY 不支持’?’绑定变量。
- 在参数化匹配模式下,origin_stmt 中不能含有常量。
- 在参数化匹配模式下,origin_stmt 和 target_stmt 中含有的绑定变量数必须相等。
- 在完全匹配模式下,target_stmt 中不能含有绑定变量。
- 创建OUTLINE时,origin_stmt 不能与系统中已经存在的相同。
- 创建OUTLINE时, target_stmt 语义必须正确,能正确生成执行计划。