Persist plan and Query-Blocker
Persist plan功能支持在SQL參數(shù)化級(jí)別使Hints持久化。Query-Blocker功能支持參數(shù)化SQL的攔截,實(shí)現(xiàn)SQL防火墻的功能。本文適用于AnalyticDB MySQL版3.1.4及以上版本的集群。
功能介紹
在集群級(jí)別開啟高級(jí)優(yōu)化特性,可能影響范圍較大。通過(guò)Persist plan設(shè)置指定SQL的Hints,可以使Hints只對(duì)相同Pattern(即參數(shù)化后的SQL)的SQL生效。Persist plan規(guī)則支持通過(guò)系統(tǒng)表查看和刪除。
通過(guò)Persist plan設(shè)置指定SQL的Hints時(shí),不會(huì)執(zhí)行當(dāng)前SQL。
相同Pattern指用
?
替代SQL里的常量,例如SELECT、WHERE中的常量條件,LIMIT m、n等。
語(yǔ)法結(jié)構(gòu)
計(jì)算SQL參數(shù)化后的Pattern和Sign:
PARAMETERIZE $sql
針對(duì)指定SQL Pattern,添加Hints:
/*+hints*/ PERSIST_PLAN $sql
針對(duì)指定SQL Pattern,刪除Hints:
DELETE_PLAN $sql
或DELETE_PLAN_BY_SIGN $Sign
查詢指定SQL是否配置過(guò)Hints:
PERSIST_PLAN_CHECK $sql
SELECT * FROM INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY
查詢配置過(guò)Hints的所有SQL Pattern:
SELECT * FROM INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY
典型應(yīng)用:攔截SQL Pattern
使用/*+query_blocker=true*/ persist_plan + SQL
,針對(duì)指定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示例
計(jì)算SQL參數(shù)化后的Pattern&Sign
針對(duì)以下SQL計(jì)算其對(duì)應(yīng)的Pattern和Sign值,示例如下:
PARAMETERIZE SELECT t1.c1 FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < 9999;
執(zhí)行命令的結(jié)果如下:
sign
sql
2506ed2c1f53ea59a1ef996a98a50411
SELECT t1.c1 FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < ?
針對(duì)指定SQL Pattern,添加Hints
為相同Pattern的SQL,執(zhí)行
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是否配置過(guò)Hints
PERSIST_PLAN_CHECK SELECT t1.c1 FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < 9999;
執(zhí)行命令的結(jié)果如下:
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 < ?
說(shuō)明PERSIST_PLAN_CHECK $sql
命令在DMS數(shù)據(jù)管理服務(wù)系統(tǒng)中執(zhí)行時(shí),執(zhí)行命令成功,但不會(huì)顯示上表中的結(jié)果。若您想看到具體返回信息,請(qǐng)登錄MySQL客戶端執(zhí)行。返回結(jié)果中,hitApplied字段表示創(chuàng)建該規(guī)則后被應(yīng)用的次數(shù),若更新該規(guī)則,hitApplied字段會(huì)清零,重新開始計(jì)數(shù)。
查詢配置過(guò)Hints的所有SQL Pattern
SELECT * FROM INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY;
針對(duì)指定SQL Pattern,刪除Hints
AnalyticDB MySQL版支持刪除指定SQL Pattern的Hints,您可以選擇以下任意一種實(shí)現(xiàn)方式:
使用
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
命令,根據(jù)Sign值刪除Hints。DELETE_PLAN_BY_SIGN 2506ed2c1f53ea59a1ef996a98a50411;
說(shuō)明查詢SQL Pattern的Sign值有以下兩種方法:
通過(guò)
PARAMETERIZE $sql
,在返回結(jié)果中查看Sign值。通過(guò)
SELECT * FROM INFORMATION_SCHEMA.KEPLER_PERSIST_PLAN_SUMMARY
,在返回結(jié)果中查看Sign值。