本文主要介绍 OceanBase 数据库中 Adaptive Cursor Sharing(自适应游标共享,以下简称 ACS)的功能与其监控点。
适用版本
OceanBase 数据库 V2.X 以后的版本。
大小账号问题
对于一些 SQL 语句,查询优化器对语句中的参数较为敏感,例如
SELECT * FROM t WHERE timestamp BETWEEN A AND B AND cust_name = C
如果 A 和 B 的差值是一个很小或不存在的时间范围(即小账号),优化器的过滤谓词性能较好;但如果该时间范围较大(即大账号),则优化器应当选择
cust_name=C
作为过滤条件,才能获得更好的查询性能。
因此,优化器需要一种对不同的参数执行不同查询计划的方式。
ACS 介绍
ACS 是一种可以让优化器为每一个参数化 SQL 存储多个计划,并根据 SQL 语句中谓词的选择率空间选择合适的计划的机制,适用于参数敏感查询的计划淘汰与脉冲流量等场景。开启 ACS 后,OceanBase 数据库会根据直方图统计信息计算某个执行计划的选择率,并根据不同的参数选择不同的执行计划。
ACS 会首先针对一类查询进行硬解析(Hard Parse),得到一个适用于所有参数的索引。在进行查询时,首先判断选择的索引的过滤性能是否稳定、高效,如果该索引不是最优的方案,则 ACS 会淘汰当前的执行计划,重新选择一个索引。影响 ACS 选择执行计划的因素包括:
- 行数
- 行数与表扫描实际输出行数的比值
- 查询实际的执行时间(通过直方图获取)
租户级别的全局变量
_optimizer_adaptive_cursor_sharing
用于控制是否开启 ACS,OceanBase 数据库 V2.2.30 前的版本中默认为 True,表示开启 ACS;OceanBase 数据库 V2.2.30 及后续的版本中,默认为 False,表示关闭 ACS。
有关该变量的详细信息,请参见《OceanBase 数据库 参考指南》中的 **系统变量 **章节。
监控方法
可以通过以下方式监控 ACS 的使用情况:
-
查询
V$PLAN_CACHE_PLAN_STAT
视图,关注以下信息:
-
IS_BIND_SENSITIVE
列表示是否允许一个参数化 SQL 缓存多个计划。
-
IS_BIND_AWARE
列表示是否为一个参数化 SQL 缓存多个计划。
-
ACS_SEL_INFO
列表示当前 ACS计划对应的选择率空间。
-
查询
V$SQL_AUDIT
视图,
GET_PLAN_TIME
列表示生成单条 SQL 查询计划的时间。
-
查询
GV$PLAN_CACHE_STAT
视图,关注
PLAN_NUM
、
MEM_USED/MEM_HOLD
与
HIT_RATE
列,表示计划缓存的整体运行情况。