本文介绍了Outline的功能及用法。

背景介绍

在使用DRDS数据库的过程中,可能遇到某些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

由于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