Persist plan功能支持在SQL参数化级别使hint持久化,Query-Blocker支持参数化SQL的拦截,实现SQL防火墙的功能。本文适用于AnalyticDB MySQL版3.1.3及以上版本的实例。

概述

  • 通过persist plan设置某条SQL的hint,可以使hint在相同pattern(即参数化SQL)的SQL上生效,设置时不会执行这条SQL。其中,相同pattern指用?替代SQL里的常量,例如select、where中的常量条件,limit m、n等。
  • 支持通过系统表查看、删除设置的persist plan。

语法结构

  • 新增persist hint:/*+hint*/ persist_plan + SQL
  • 删除persist plan中的目标SQL:persist_plan + SQL
  • 查看所有persist plan中的模板:select * from information_schema.kepler_meta_persist_plan
  • 拦截SQL(Query-Blocker):/*+query_blocker=true*/ persist_plan + SQL

使用场景

  • 某些高级优化特性在集群级别开启可能影响面较大,希望在确定的场景下加hint,不需要改SQL,可以通过persist plan设置这类SQL的hint。
  • 希望控制某类BAD SQL能被拦截掉,可以使用/*+query_blocker=true*/ persist_plan + SQL语法,设置针对某种pattern的拦截功能。

示例

新增persist hint
SELECT t1.c1
FROM
  t1 INNER JOIN t2 ON t1.c1 = t2.c1
WHERE t1.c2 < ?;

针对以上pattern的SQL使用nested loop join,示例如下:

/*+nested_loop_join=true*/
persist_plan
SELECT
  t1.c1
FROM
  t1
  INNER JOIN t2 ON t1.c1 = t2.c1
WHERE
  t1.c2 < 2;
查看persist plan是否生效
SELECT cluster_name, hints, sign, sql FROM information_schema.kepler_meta_persist_plan;
命令执行结果如下:
cluster_name hints sign sql
502683816_am-xxxxx_xxxxx_xxxxx nested_loop_join=true 79c37d4bbc162fb2b90090fcd185b7da SELECT t1.c1 FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c2 < ?
删除persist plan
persist_plan
SELECT
  t1.c1
FROM
  t1 INNER JOIN T2 ON t1.c1 = t2.c1
WHERE t1.c2 < 2;