Vastbase G100 V2.2 Build 10(Patch No.17)
发布日期
2024年7月2日
升级方式
VPatch工具升级。可参考使用VPatch进行版本控制。
commit 标识:【21029】
新特性
系统表
支持统计字段值超过1024 bytes的列信息并记录在PG_STATISTIC系统表中。
支持统计语句执行计划的绑定信息并记录在PG_SQLBIND系统表中。
支持统计语句执行计划的相关信息并记录在PG_SQLPLAN系统表中。
函数
新增DBE_SQL_UTIL.import_sql_bind函数,用于绑定执行计划的函数,调用成功后返回void。
新增DBE_SQL_UTIL.drop_sql_bind函数,用于删除绑定的执行计划的函数,调用成功后返回void。
备份恢复
vb_probackup支持流式备份能力:支持通过标准输入输出进行备份或恢复。
插件
新增支持pg_prewarm插件,允许管理员手动预加载指定的表或索引数据到数据库的共享缓冲区(shared buffers),这个过程也被称为“预热”。预热后,查询可直接从内存中访问数据,有效提高数据库重启后首次查询时的性能。目前Vastbase仅实现对pg_prewarm的语法兼容,无法保证预热后对查询性能存在提升效果。
执行计划
支持将SQL语句的query_id与执行计划的plan_id绑定,通过绑定的执行计划执行语句。
GUC参数
新增GUC参数enable_je_enhanced,用于控制是否启用JOIN ELIMINATION子表消除功能。
新增GUC参数enable_ora_group参数控制group by后接的常量和NULL是否被忽略。
新增GUC参数new_sort_msdradix_size_threshold,用于在开启自适应排序的情况下,当排序的位宽超过该参数设置的值时,使用 MsdRadixSort 排序算法;反之使用 LsdRadixSort 排序算法。
新增GUC参数new_sort_store_strxfrm_var,用于在开启自适应排序的情况下,对于 TEXT、BPCHAR、VARCHAR 类型,在 collate 不为 “C” 时是否保存 strxfrm() 后的字符串,以提高字符串比较的性能。开启后可以提升字符串比较与排序性能,但会占用更大的工作内存。
新增GUC参数new_sort_string_prefix_length,用于设置在开启自适应排序的情况下,TEXT、BPCHAR、VARCHAR 类型放入排序空间的数据长度。
新增GUC参数b_compatibility_user_host_ignore进行控制创建用户的写法。
新增GUC参数enable_generated_column_prune控制分区键是虚拟列时,是否允许查询时进行分区剪枝。
MySQL兼容性
支持在CREATE TABLE时增加对列的注释,可在\d+查看表结构时查看列注释。
支持在CREATE TABLE的主键时指定USING BTREE。
建表时指定USING BTREE仅为语法兼容,不实现其功能,当USING后跟BTREE以外的选项时将报错。
支持在CREATE TABLE时指定ENGINE。
建表时指定ENGINE仅为语法兼容,不实现其功能。
支持在ALTER TABLE时使用MODIFY子句修改表的已有字段时定义列的注释,修改后可通过\d+查看。
支持使用ALTER TABLE时修改字段的COLLATE时,若指定的排序规则不存在,则设置为DEFAULT。
支持使用RETURNS CHARSET和RETURN()语法创建函数,详见CREATE FUNCTION。
支持创建
user@host
、'user'@'host'
之类的用户。通过GUC参数b_compatibility_user_host_ignore进行控制。
PostgreSQL兼容性
支持通过CREATE TABLE为表中字段指定IDENTITY属性,或通过ALTER TABLE的ALTER COLUMN子句为字段指定IDENTITY属性。
支持临时表/全局临时表的ON COMMIT DROP语法。
Oracle兼容性
内置包
内置包子程序DBMS_LOB.READ的读取类型支持BLOB/CLOB。
内置包子程序DBMS_SQL.DEFINE_COLUMN的列值入参类型支持CLOB,BLOB。
内置包子程序DBMS_SQL.COLUMN_VALUE的列值入参类型支持CHAR,RAW,CLOB,BLOB数据类型,其中CHAR,RAW类型的值需要调用特定的DBMS_SQL.COLUMN_VALUE_CHAR和DBMS_SQL.COLUMN_VALUE_RAW函数变体。
SQL语法
支持忽略group by后接的常量和NULL,即处理方式与Oracle保持一致。其中常量包括数字、中文、英文。本特性通过enable_ora_group参数控制,当取值为true时开启本特性。详情参见GROUP BY特性增强。
多表关联的视图支持通过视图对单个基表进行DML操作(插入、更新、删除)。
函数
支持使用PG_GET_VIEWDEF函数保存和查看创建视图时的注释信息。
系统视图
动态性能视图V$SESSION新增saddr、audsid、osuser和machine字段。
PL/SQL
支持在PL/pgSQL的异常处理中使用invalid_number、dup_val_on_index错误码。
特性优化
SQL语法
在查询语句中,支持对左外连接进行优化,消除不需要的右表,提升查询效率。详见JOIN ELIMINATION。
支持在特定场景下消除不影响最终查询结果的ORDER BY子句,从而增强优化器的能力,提高执行效率。详见ORDER BY ELIMINATION。
支持在查询语句中使用FOR UPDATE OF语法,仅做语法兼容,支持后跟列名,形如table_name.column_name的写法,但不支持schema.table_name、schema.table_name.column_name。
支持通过以下策略改善启用wdr后产生的快照占用空间大的问题:
用于控制后台线程Snapshot自动对数据库监控数据执行快照操作时间间隔的参数wdr_snapshot_interval,其最大值从60min提升为720min。适当提高此参数值可以降低采样频率。
设置参数wdr_snapshot_auto_vacuum_full为on后,wdr相关统计表中的死亡元组会在原有每次的清理操作之后被清除。
SQL引擎
ROWNUM查询性能优化,原始ROWNUM查询在执行时会整表扫描,然后再判断ROWNUM的条件,执行效率较低,对于特定场景优化为LIMIT节点可以提前结束执行,以提高执行效率。
支持自适应排序,能够将不同数据类型的数据进行解析,并根据实际情况选择合适的排序算法。
升级须知
- 使用PL/Python实现自定义过程语言时,禁止使用plpy模块。
- 通过VPatch补丁升级前必须设置参数plsql_show_all_error为off。
行为变更说明
模块 | 变更项 | 变更前 | 变更后 | 注意事项 |
---|---|---|---|---|
存储引擎 | enable_wdr_snapshot开启时的功能。 | enable_wdr_snapshot开启时,没有记录数据使用的统计情况。 | enable_wdr_snapshot开启时,记录数据库使用的统计情况。此项目含义为,开启此参数时,会产生额外的记录。 | 新增系统表vb_usage_statistic,用于采集记录数据库使用情况,包括采集时间戳和采集时事务号,增加系统函数用来查询vb_usage_statitic的统计情况。 |
函数 | upper和lower的参数为char类型,显示结果变更。 | char类型末尾的空格会被丢掉。由于lower \ upper (char) 函数的返回值在历史版本处理为text类型,所以会丢弃掉字符的末尾空白。 | char类型末尾的空格会保留。 | 需调整upper和lower函数入参为char时的结果预期。 |
SQL语法 | ALTER SYSTEM KILL SESSION结束会话语法格式。 | ALTER SYSTEM KILL SESSION 'session_sid, serial' [ IMMEDIATE ]; | ALTER SYSTEM KILL SESSION 'thread_id, session_id' [ IMMEDIATE ]; 删除了原始根据session 顺序进行kill 的语法,因为会有顺序不对应的情况出现,增加了使用thread_id 的kill方式。 | 需修改结束会话相关语法。 |
EXPLAIN输出 | 不支持绑定计划输出。 | 支持在使用绑定计划时,输出该计划使用了绑定计划的内容,如:[SQLBIND] This SQL is using bind plan, bindname:xxx | 由于新增了计划绑定功能,现在可能会看到[SQLBIND] This SQL is using bind plan, bindname这种格式的计划,这是合理的表现,因为需要通知计划层和调用explain 的用户,使用的是绑定的计划。 | |
WHERE CURRENT OF | 连续更新同一条记录时,第二次会找不到对应记录 | 可以连续更新同一记录 | 原始连续更新同一条游标记录时,会产生报错,是一个不合理的表现。新版本上进行了兼容处理。 | |
分区表查询过滤条件带分区键且所有分区都被过滤掉的情况下的执行计划。 | 有索引会走索引扫描,否则走顺序扫描。 | 一定会走顺序扫描。 | 当分区键可以过滤所有的分区时,根据现有计划层的代价计算方式,使用索引扫描无法命中的分区的启动代价会高于顺序扫描,优化器选择了代价更高的路径,这是一个不合理的表现。所以对于符合此场景没有任何实际扫描工作的计划,固定使用顺序扫描。 | |
安全 | 透明加密 | 透明加密不支持软件加密。 | 透明加密支持软件加密,建表语句支持with(enable_tde=on,encrypt_algo=xxx)来开启软件透明加密。 | 之前版本透明加密未生效。 |
GUC参数 | b_format_behavior_compat_options | 不支持选项b_format_escape。 | 新增选项b_format_escape,用来控制逃逸字符在MySQL兼容模式中的表现:
|
使用中间件连接,例如mybatis 等中间件,根据我们的连接串特点认为vastbase属于pg数据库。因此对转义符的处理按照pg方式处理,这导致了B模式下对MySQL的逃逸字符支持功能和中间件处理产生冲入,因此引入了兼容的处理方式。 |
参数sql_beta_feature的取值。 | 参数sql_beta_feature不支持选项subquery_rownumber_eq_sel。 | 参数sql_beta_feature 新增选项subquery_rownumber_eq_sel,表示子查询以row_number列作为过滤条件时,按数据分布估算结果集行数。 | - | |
Oracle兼容性 | 字符常量间比较。 | 字符常量末尾空格参与比较。 | 字符常量末尾空格不参与比较。 | 常量字符如 vsql中使用'aA'= 'aa'时,因为现有的类型系统中,我们会将此种为明确类型的字符常量做为text进行比较,这种比较方式跟oracle的处理逻辑不同,会带有末尾的空格进行比较。因此为了兼容oracle 的行为,目前版本中的vastbase认为,常量字符类型的比较,末尾空格是可忽略的。 |
DBMS_SQL内置包 DEFINE_COLUMN函数,在未找到对应游标时的处理 | 未报错直接返回 | 报错提示 cursor not found,未找到游标时认为不需要做任何处理转为报错。 | 需调整错误结果预期。 | |
UTL_RAW内置包函数 | 可以不带包名,直接使用包内函数 | cast_to_raw等归属于utl_raw包的包函数,必须使用utl_raw.cast_to_raw 带包名的方式调用。 | 需检查使用UTL_RAW内置包函数的语句是否带有包名。 | |
text/longtext到jsonb类型的转换 | text/longtext到jsonb做隐式转换 | text/longtext到jsonb进行赋值 | 历史版本中,将text -> jsonb做成了隐式转化,这个不合理的原因在于,不是所有text类型的字符串,都能满足jsonb的解析规则,就导致了某些场景下,把text类型的数据按照向jsonb的类型进行转化后处理。 实际上,这个转化应该被定义为赋值转化,也就是说当明确的讲一个text类型的内容赋值到明确的jsonb类型的字段等结构中时,再执行转化操作,这才明确符合转化的场景。 | |
MySQL兼容性 | MySQL兼容模式下查询视图时的权限检查。 | MySQL兼容模式下,查询视图时不检查用户对模式的权限。 | MySQL兼容模式下,查询视图时检查用户对模式的权限。目前权限系统仍然沿用原始鉴权逻辑,虽然MySQL不会有这种鉴权,但是基于功能一致性,应该保留这种鉴权机制。 | 需检查用户查询视图场景下,用户是否具有对模式的权限。 |
参数vastbase_sql_mode的取值。 | 没有error_for_division_by_zero选项 | 新增error_for_division_by_zero选项,用于控制MySQL兼容模式下除以0时是否提示Warning信息 | - | |
MySQL兼容模式下,convert、cast函数支持的数据类型扩充。 | 不支持cast、convert函数将源类型转换为SIGNED/UNSIGNED INTEGER。 | 支持cast、convert函数将源类型转换为SIGNED/UNSIGNED INTEGER,例如convert (123 as signed integer/signed int/unsigned integer/unsigned int)。 | - | |
curdate函数返回结果 | curdate函数转换为date日期采用的是UTC时间获取日期。 | curdate函数采用当前数据库设置的时区信息获取日期 | - | |
涉及用户名的语法中支持SESSION_USER()语法。 | 不支持SESSION_USER()语法,SESSION_USER返回的是CURRENT_USER当前用户。 | 支持SESSION_USER()语法,SESSION_USER/SESSION_USER()返回会话用户。 | - | |
PostgreSQL兼容性 | PostgreSQL兼容模式下rownum关键字。 | rownum是关键字,不能作为列的别名。 | rownum不会被作为一个伪列来处理,可以作为列的别名。 | - |
PG分区表支持的索引类型。 | 支持PG分区表的GLOBAL索引,但实际上无法使用。 | 不支持PG分区表的GLOBAL索引,默认创建LOCAL索引。 | PG默认不支持GLOBAL索引,历史版本支持属于沿用了Vastbase历史的分区表索引机制。但是GLOBAL索引本质上并不适合用于pg分区表中。且还会带来隐藏的问题,因此在新版本中默认创建的索引变为LOCAL索引,且历史若使用了GLOBAL索引,建议重建为LOCAL索引避免问题。 | |
使用PG分区表语法创建的分区用\d查询分区数显示情况。 | Number of partitions显示恒为1。 | 用户创建的对应的分区表的一级分区个数 | - |