基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
关于系统视图中的 IS_BATCHED_MULTI_STMT 和 PARAMS_VALUE、PARAM_INFOS 的说明
更新时间:2026-07-31 09:11
OceanBase 数据库 V4.x 版本 sys 租户和所有业务租户的 gv$ob_sql_audit 视图中均提供了 is_batched_multi_stat 和 params_value 这两个字段,而 gv$ob_plan_cache_plan_stat 视图中则提供了 is_batched_multi_stat和 param_infos 这两个字段。 本文主要介绍这几个字段之间的关系以及在不同场景下的取值说明。
详细说明
在 gv$ob_sql_audit 视图中:
| 字段名称 | 类型 | 是否可以为 NULL | 描述 |
|---|---|---|---|
| IS_BATCHED_MULTI_STMT | tinyint(4) | NO | 是否进行 Batch Multi Stmt 的优化 |
| PARAMS_VALUE | longtext | NO | PS 绑定的参数值 |
在 gv$ob_plan_cache_plan_stat 视图中:
| 字段名称 | 类型 | 是否可以为 NULL | 描述 |
|---|---|---|---|
| PARAM_INFOS | longtext | NO | 执行计划被参数化后,所有被参数化参数的数据类型 |
| IS_BATCHED_MULTI_STMT | tinyint(4) | NO | 表示是否为 Batched Multi Stmt 优化的计划 |
IS_BATCHED_MULTI_STAT
gv$ob_sql_audit 视图中的 is_batched_multi_stat 可以通过 svr_ip+svr_port+tenant_id+plan_id 四元组跟 gv$ob_plan_cache_plan_stat 中的 is_batched_multi_stat 关联对应起来。正常情况下,这两个字段取值应该完全一致;或者都是 0,代表未使用 Batch 成组执行优化;或者都是 1,代表使用了 Batch 成组执行优化。
is_batched_multi_stmt=0:
场景一: 非 Batch DML、非 ArrayBinding 执行。
场景二: SQL 被
rewriteBatchedStmts=true选项改写成单条multi-values insert语句(即类似insert into xxx values (...),(...),(...)这样的单条 SQL 语句)。场景三: 走 PS 二进制协议时,
batch update/delete不支持被rewriteBatchedStmts=true选项改写为multi-stmt update/delete,退化为每条update/delete语句都提交一次。场景四: 走 ArrayBinding 协议执行,但是业务租户的
ob_enable_batched_multi_stat=False。场景五: 走 ArrayBinding 协议执行,但是该 Batch 中只包含了一条记录。
is_batched_multi_stmt=1:
场景一: 走文本协议时,SQL 被
rewriteBatchedStmts=true选项改写成多条以;分隔的multi-stmt update/delete语句(即类似update t set b='value1' where a=1;update t set b='value2' where a=2;或者delete from t where id=1;delete from t where id=2;这样格式一致的多条update/delete语句)。场景二: 走 ArrayBinding 协议执行,同时业务租户的
ob_enable_batched_multi_stat=True,且该 Batch 中包含了多条记录。
PARAMS_VALUE
params_value="": 代表该 SQL 走了普通文本协议(对应使用了
Statement类)或 PS 文本协议(对应使用了PreparedStatement类)。params_value=NULL,NULL,NULL,...,: 代表该 SQL 走了 ArrayBinding 协议(使用或者未使用 Batch 成组执行优化),这边的 NULL 的个数等于
QUERY_SQL语句中绑定的 PS 变量的数目:query_sql: INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (?, ?, ?, ?, ?, ?, ?, ?) params_value: NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL affected_rows: 3 is_batched_multi_stmt: 1 PS_CLIENT_STMT_ID: 1 ps_inner_stmt_id: -1params_value=以逗号分隔的一组具体的取值: 代表该 SQL 走了 PS 二进制协议,这边的每个取值依次对应该条记录的
QUERY_SQL中的一个?占位符:query_sql: INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES (?, ?, ?, ?, ?, ?, ?, ?), (?, ?, ?, ?, ?, ?, ?, ?), (?, ?, ?, ?, ?, ?, ?, ?) params_value: 7369,'SMITH','CLERK',7902,'1980-12-17 00:00:00',800,0,20,7499,'ALLEN','SALESMAN',7698,'1981-02-20 00:00:00',1600,300,30,7521,'WARD','SALESMAN',7698,'1981-02-22 00:00:00',1250,500,30 affected_rows: 3 is_batched_multi_stmt: 0 PS_CLIENT_STMT_ID: 2 ps_inner_stmt_id: 28
PARAM_INFOS
gv$plan_cache_plan_stat 视图中的 PARAM_INFOS 记录执行计划被参数化后,所有被参数化参数的数据类型:
如果使用了 PS 二进制协议:
PARAM_INFOS跟QUERY_SQL中所有的PS绑定变量的数据类型一一对应:MySQL [oceanbase]> select * from gv$ob_plan_cache_plan_stat where plan_id=4605\G *************************** 1. row *************************** STATEMENT: delete from emp where job=? and ename=? and empno > 1 QUERY_SQL: delete from emp where job=? and ename=? and empno > 1 SPECIAL_PARAMS: PARAM_INFOS: {1,0,0,-1,23},{1,0,0,-1,23}比如这边 PS 绑定变量有两个,所以
PARAM_INFOS对应了这两个 PS 绑定变量的数据类型。如果未使用 PS 二进制协议:
PARAM_INFOS则对应了QUERY_SQL中所有的被参数化常量的数据类型:MySQL [oceanbase]> select * from gv$ob_plan_cache_plan_stat where plan_id=4714\G *************************** 1. row *************************** STATEMENT: delete from emp where job= ? and ename= ? and empno > ? QUERY_SQL: delete from emp where job= 'SALESMAN' and ename= 'SMITH' and empno > 1;delete from emp where job= 'CLERK' and ename= 'ALLEN' and empno > 1;delete from emp where job= 'CLERK' and ename= 'WARD' and empno > 1 SPECIAL_PARAMS: PARAM_INFOS: {1,0,0,-1,23},{1,0,0,-1,23},{1,0,0,-85,15}
备注
目前 gv$ob_sql_audit 视图中的 is_batched_multi_stmt 字段有个已知的问题:即使 Batch DML 使用了 ArrayBinding 协议及 Batch 成组执行优化,这个 is_batched_multi_stmt 字段还是为 0,该问题修复在 OceanBase 数据库 V4.2.1 BP9(oceanbase-4.2.1.9-109000092024091919)、V4.2.5 BP4(oceanbase-4.2.5.4-104000082025052817)、V4.3.5 BP2(oceanbase-4.3.5.2-102000162025051417)版本。gv$ob_plan_cache_plan_stat 中的 is_batched_multi_stmt 则一直是准确的,可以优先参考使用后者。
适用版本
OceanBase 数据库 V4.x 版本。