首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 数据库中快速参数化的含义
更新时间:2025-03-06 07:36
快速参数化是 OceanBase 数据库中 SQL 语句执行流程在优化器中特有的优化行为。本文介绍快速参数化的实现以及使用。
适用版本
OceanBase 数据库 V2.X 版本
基本功能
快速参数化是 OceanBase 数据库中,SQL 语句执行流程在优化器中特有的优化行为。 其特征为:
默认使用词法分析对文本串直接参数化后,作为计划缓存的键值。基于快速参数化的执行计划缓存可以省去语法分析过程,并且在查找 Hash Map 时,对参数化后语法树的 Hash 和比较操作可替换为对文本串进行 Hash 和 Memcmp 操作,效率更高。
对于明确列出的不能快速参数化与暂不支持计划缓存的场景则使用语法或词法解析(即 normal parse)得到带约束条件的执行计划作为 Plan Cache 的键值。
OceanBase 数据库中,以下场景中的常量均不能参数化:
所有 ORDER BY 后常量。例如
ORDER BY 1,2;。所有 GROUP BY 后常量。例如
GROUP BY 1,2;。LIMIT 后常量。例如
LIMIT 5;。作为格式串的字符串常量,例如
SELECT DATE_FORMAT('2006-06-00', '%d');中的%d。函数输入参数中,影响函数结果并最终影响执行计划的常量。例如
CAST(999.88 as NUMBER(2,1))中的NUMBER(2,1),或者SUBSTR('abcd', 1, 2)中的1, 2。函数输入参数中,带有隐含信息并最终影响执行计划的常量。例如
SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19.012');中的2015-11-13 10:20:19.012,指定输入时间戳的同时,隐含指定了函数处理的精度值为毫秒。
快速参数化的流程示意图如下所示。

注意事项
OceanBase 数据库中快速参数化的逻辑是基于完备的匹配规则的,而规则的梳理需要时间完善(例如 LIKE 语句精确匹配、临时表、ACS、分布式场景下的数据分布情况、数据类型匹配、环境变量信息匹配等)。
以下语句可能会影响快速参数化的性能:
SIMILAR语句出现空格形式(空格、制表符、换行符等)或文本值。这是由于OceanBase 数据库没有force_matching_signature机制。以上形成的sql_id在 outline 按照sql_id绑定时存在问题。大于 200 条的
IN列表。大型的
CASE WHEN ... THEN语句。可以通过查询
v$plan_cache_stat与v$plan_cache_plan_stat视图查询执行计划缓存的命中情况。v$plan_cache_stat用于查询当前租户在所有 Server 上的每个计划缓存整体的状态。v$plan_cache_plan_stat用于查询当前租户在当前 Server 上的计划缓存中缓存的每一个缓存对象的状态。