本文介绍了Outline的功能及用法。
背景介绍
在使用PolarDB-X 1.0数据库的过程中,可能遇到某些SQL优化器生成的执行计划,并不是期望的结果,或者生成的计划并不是最优的,比如有些Join、Aggregate 函数可以下推到下层RDS执行的,但是并没有下推。Outline功能提供了一种给SQL指定执行计划的方式,您可以通过Hint的方式手工构建SQL的执行计划,并通过Outline的方式将构建的执行计划指定为SQL的执行计划。
Outline功能提供了CREATE,DROP,RESYNC,DISABLE,ENABLE,SHOW指令来创建和管理系统中的Outline,下面对各个指令进行说明。
约束
- 多语句不支持。
- GROUP BY,ORDER BY不支持"?"绑定变量。
- 在参数化匹配模式下,origin_stmt中不能含有常量。
- 在参数化匹配模式下,origin_stmt和target_stmt中含有的绑定变量数必须相等。
- 在完全匹配模式下,target_stmt中不能含有绑定变量。
- 创建OUTLINE时,origin_stmt不能与系统中已经存在的相同。
- 创建OUTLINE时, target_stmt语义必须正确,能正确生成执行计划。
创建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 select 1 to select 2;
Query OK, 1 row affected (1.09 sec)
mysql> select 1;
+------+
| ? |
+------+
| 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 select 1;
+----------------------------------------------------------------------------+
| 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
由于PolarDB-X 1.0实例是由多台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