Persist plan功能支援在SQL參數化層級使Hints持久化。Query-Blocker功能支援參數化SQL的攔截,實現SQL防火牆的功能。本文適用於AnalyticDB MySQL版3.1.4及以上版本的叢集。
功能介紹
在叢集層級開啟進階最佳化特性,可能影響範圍較大。通過Persist plan設定指定SQL的Hints,可以使Hints只對相同Pattern(即參數化後的SQL)的SQL生效。Persist plan規則支援通過系統資料表查看和刪除。
通過Persist plan設定指定SQL的Hints時,不會執行當前SQL。
相同Pattern指用
?替代SQL裡的常量,例如SELECT、WHERE中的常量條件,LIMIT m、n等。
文法結構
計算SQL參數化後的Pattern和Sign:
PARAMETERIZE $sql針對指定SQL Pattern,添加Hints:
/*+hints*/ PERSIST_PLAN $sql針對指定SQL Pattern,刪除Hints:
DELETE_PLAN $sql或DELETE_PLAN_BY_SIGN $Sign查詢指定SQL是否配置過Hints:
PERSIST_PLAN_CHECK $sqlSELECT * FROM INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY
查詢配置過Hints的所有SQL Pattern:
SELECT * FROM INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY
典型應用:攔截SQL Pattern
使用/*+query_blocker=true*/ persist_plan + SQL,針對指定Pattern攔截同類型的Bad SQL。樣本如下:
/*+query_blocker=true*/
PERSIST_PLAN
SELECT t1.c1
FROM t1
INNER JOIN t2 ON t1.c1 = t2.c1
WHERE t1.c2 < 9999;Persist Plan樣本
計算SQL參數化後的Pattern&Sign
針對以下SQL計算其對應的Pattern和Sign值,樣本如下:
PARAMETERIZE SELECT t1.c1 FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < 9999;執行命令的結果如下:
sign
sql
2506ed2c1f53ea59a1ef996a98a50411
SELECT t1.c1 FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < ?
針對指定SQL Pattern,添加Hints
為相同Pattern的SQL,執行
nested loop join策略,樣本如下:/*+nested_loop_join=true*/ PERSIST_PLAN SELECT t1.c1FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < 9999;查詢指定SQL是否配置過Hints
PERSIST_PLAN_CHECK SELECT t1.c1 FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < 9999;執行命令的結果如下:
sign
Hints
hitAppiled
sql
2506ed2c1f53ea59a1ef996a98a50411
nested_loop_join=true
12
SELECT t1.c1 FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < ?
說明PERSIST_PLAN_CHECK $sql命令在Data Management服務系統中執行時,執行命令成功,但不會顯示上表中的結果。若您想看到具體返回資訊,請登入MySQL用戶端執行。返回結果中,hitApplied欄位表示建立該規則後被應用的次數,若更新該規則,hitApplied欄位會清零,重新開始計數。
查詢配置過Hints的所有SQL Pattern
SELECT * FROM INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY;針對指定SQL Pattern,刪除Hints
AnalyticDB MySQL版支援刪除指定SQL Pattern的Hints,您可以選擇以下任意一種實現方式:
使用
DELETE_PLAN $sql命令,刪除Hints。DELETE_PLAN SELECT t1.c1 FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < 9999;使用
DELETE_PLAN_BY_SIGN命令,根據Sign值刪除Hints。DELETE_PLAN_BY_SIGN 2506ed2c1f53ea59a1ef996a98a50411;說明查詢SQL Pattern的Sign值有以下兩種方法:
通過
PARAMETERIZE $sql,在返回結果中查看Sign值。通過
SELECT * FROM INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY,在返回結果中查看Sign值。