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