关于 OceanBase 数据库的 ACS 功能介绍有哪些?

本文主要介绍 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

    列,表示计划缓存的整体运行情况。

好文!