本文介紹了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