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*/ hint + persist plan 语法,设置针对某种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 * from information_schema.kepler_meta_persist_plan
命令执行结果如下:
cluster_name hints sign sql
502683816_am-xxxxx_xxxxx_xxxxx nested_loop_join=true 79c37d4bbc162fb2b90090fcd185b7da SELECT T1.c1FROM T1 T1INNER JOIN T2 T2 ON T1.C1 = T2.C1WHERE T1.C2 < ?
删除persist plan
persist_plan
SELECT
  t1.c1
FROM
  T1 INNER JOIN T2 ON T1.C1 = T2.C1
WHERE T1.C2 < 2;