SQL_ID 用于唯一确定一个查询语句,它是由查询语句经过快速参数化后得到的字符串的 MD5 值,返回 128 位的哈希值。相同文本的 SQL 的 SQL_ID 总是相同的。 Plan_ID 用于在单个 OBServer 上唯一确定 plan_cache 中的一个 plan,plan_id 是 OBServer 启动后通过一个本地范围内的自增序列产生的值,OBServer 重启后,plan_id 会重置。 Plan cache 是租户间隔离的,在一台 OBServer 中,plan_id 和 tenant_id 一起决定一个执行计划。 当前 OceanBase 数据库的 plan cache 中,SQL_ID 相同的语句想共享 plan_id 会受到一些变量的影响,这些变量体现在 gv$plan_cache_plan_stat 的 sys_var 字段中,相关内容如下。
| 变量 | 含义 |
|---|---|
| collation_connection | 用于设置连接使用的字符集和字符序 |
| sql_mode | 用于设置 SQL 模式,不同的 SQL 模式对于数据库行为有很大影响 |
| binlog_row_image | 用于控制是否记录全列日志。 |
| div_precision_increment | 用于设置除法结果精度在被除数精度基础上的增量,是 MySQL 兼容功能 |
| explicit_defaults_for_timestamp | 用于指定 timestamp 数据类型在处理默认值和空值时是否启用非标准行为 |
| read_only | 用于设置租户是否为只读模式 |
| sql_auto_is_null | 用于控制 ODBC 等特殊的驱动程序是否获取最后插入行的自增列值 |
| ob_max_parallel_degree | 用于设置每次请求最大的并发数 |
| ob_read_consistency | 用于设置读一致性级别 |
| ob_enable_transformation | 用于设置是否开启 SQL 优化器的改写功能 |
| ob_enable_index_direct_select | 用于设置是否允许用户直接查询索引表 |
| ob_enable_hash_group_by | 用于设置是否打开 Hash Group by 的路径 |
| ob_enable_blk_nestedloop_join | 用于设置是否允许打开 block nested loop join |
| ob_bnl_join_cache_size | 用于设置 batch nest loop join 一次 cache 多少数据做一次 batch |
| ob_stmt_parallel_degree | 用于设置查询的并行度,即可以并行运行的任务数。该变量已不再使用 |
| ob_route_policy | 用于设置 OBProxy 或 Java 客户端与 OBServer 内部重试的路由策略 |
| ob_enable_jit | 用于设置 JIT 执行引擎模式 |
| _ob_use_parallel_execution | 用于判断是否开启并行,0 表示关闭,1 表示开启。 |
| nls_sort | 表示字符串值的排序规则 |
| nls_comp | 表示字符串值的比较规则 |
| nls_nchar_characterset | 表示数据库默认字符集,用于 NCHAR、NVARCHAR2、NCLOB 等数据类型 |
| nls_length_semantics | 表示 char、varchar2 类型 的 length 语义 |
| nls_characterset | 用于查看数据库中 CHAR、VARCHAR2、CLOB 等数据类型的默认字符集 |
| nls_nchar_conv_excp | 用于控制 NCHAR/NVARCHAR2 与 CHAR/VARCHAR2 之间转换丢失数据时是否报错 |
| _nlj_batching_enabled | 用于控制 NLJ 中是否使用 batch join 的方式来 join 右表(一次性把多条记录推到右表去进行 join) |
| secure_file_priv | 用于控制导入或导出到文件时可以访问的路径。仅 DBA 可以设置该变量,其他人无法设置 |
| _enable_parallel_query | 控制默认情况下 PX 的 query 的 parallel 的开关 |
| _force_parallel_query_dop | 控制 query 执行默认的并行度 |
| ob_enable_aggregation_pushdown | 用于设置是否允许聚合操作下压 |
可通过下述步骤重现。
连接业务租户,执行下述变更。
--执行两次查询 obclient [U_LXL]> select count(*) records from NGCRM_XX.IM_PR_COMRESPHONE tst; +---------+ | RECORDS | +---------+ | 3319193 | +---------+ 1 row in set (0.306 sec) obclient [U_LXL]> select count(*) records from NGCRM_XX.IM_PR_COMRESPHONE tst; +---------+ | RECORDS | +---------+ | 3319193 | +---------+ 1 row in set (0.245 sec) --修改一个已经废止的变量ob_max_parallel_degree obclient [U_LXL]> show variables like 'ob_max_parallel_degree'; +------------------------+-------+ | VARIABLE_NAME | VALUE | +------------------------+-------+ | ob_max_parallel_degree | 32 | +------------------------+-------+ 1 row in set (0.012 sec) obclient [U_LXL]> set ob_max_parallel_degree=64; Query OK, 0 rows affected (0.001 sec) --重新查询两次 obclient [U_LXL]> select count(*) records from NGCRM_XX.IM_PR_COMRESPHONE tst; +---------+ | RECORDS | +---------+ | 3319193 | +---------+ 1 row in set (0.273 sec) obclient [U_LXL]> select count(*) records from NGCRM_XX.IM_PR_COMRESPHONE tst; +---------+ | RECORDS | +---------+ | 3319193 | +---------+ 1 row in set (0.245 sec) --还原被废止的环境变量后重新查询 obclient [U_LXL]> set ob_max_parallel_degree=32; Query OK, 0 rows affected (0.001 sec) obclient [U_LXL]> select count(*) records from NGCRM_XX.IM_PR_COMRESPHONE tst; +---------+ | RECORDS | +---------+ | 3319193 | +---------+ 1 row in set (0.247 sec)连接 SYS 租户,进行分析。
--可以看到生成了两次 plan_id obclient [oceanbase]> select TRACE_ID,sql_id,PLAN_ID,USER_NAME,SVR_IP,SVR_PORT from gv$sql_audit where query_sql = 'select count(*) records from NGCRM_XX.IM_PR_COMRESPHONE tst'; +-----------------------------------+----------------------------------+---------+-----------+---------------+----------+ | TRACE_ID | sql_id | PLAN_ID | USER_NAME | SVR_IP | SVR_PORT | +-----------------------------------+----------------------------------+---------+-----------+---------------+----------+ | YB420A6C9B05-0005FE2684CAA018-0-0 | 40C8A2FBE379C0CD53A00467E969B27D | 3631 | U_LXL | xxx.xxx.xxx.xxx | xxxx | | YB420A6C9B05-0005FE266EBAC3DF-0-0 | 40C8A2FBE379C0CD53A00467E969B27D | 3631 | U_LXL | xxx.xxx.xxx.xxx | xxxx | | YB420A6C9B05-0005FE266EBAC3E0-0-0 | 40C8A2FBE379C0CD53A00467E969B27D | 3635 | U_LXL | xxx.xxx.xxx.xxx | xxxx | | YB420A6C9B05-0005FE267FFAA051-0-0 | 40C8A2FBE379C0CD53A00467E969B27D | 3635 | U_LXL | xxx.xxx.xxx.xxx | xxxx | | YB420A6C9B05-0005FE266F1AC423-0-0 | 40C8A2FBE379C0CD53A00467E969B27D | 3631 | U_LXL | xxx.xxx.xxx.xxx | xxxx | +-----------------------------------+----------------------------------+---------+-----------+---------------+----------+ 5 rows in set (12.088 sec) --可以看到 两个 Plan_id 的 sys_var 不一致 obclient [oceanbase]> select sys_vars,plan_id from oceanbase.gv$plan_cache_plan_stat where sql_id='40C8A2FBE379C0CD53A00467E969B27D' and svr_ip='xxx.xxx.xxx.xxx' and PLAN_ID in(xxxx,xxxx); +-----------------------------------------------------------------------------------------------------------------------------------------+---------+ | sys_vars | plan_id | +-----------------------------------------------------------------------------------------------------------------------------------------+---------+ | 45,46,2151677954,2,4,1,0,0,32,3,1,0,1,1,0,10485760,1,1,0,1,BINARY,BINARY,ZHS16GBK,AL16UTF16,BYTE,FALSE,1,100,64,200,0,13,NULL,1,1,1,1,0 | xxxx | | 45,46,2151677954,2,4,1,0,0,64,3,1,0,1,1,0,10485760,1,1,0,1,BINARY,BINARY,ZHS16GBK,AL16UTF16,BYTE,FALSE,1,100,64,200,0,13,NULL,1,1,1,1,0 | xxxx | +-----------------------------------------------------------------------------------------------------------------------------------------+---------+ 2 rows in set (0.027 sec)
适用版本
OceanBase 数据库 V3.x 版本