#23.4.2
# 版本定位
YashanDB v23.4.2版本在v23.4.1的基础上丰富了新特性与持续进行性能优化,为可用于长期服务支持的版本。
# 版本信息
版本号:v23.4.2.100
发版日期:2025 年 7 月 18 日
# 新增功能
YashanDB v23.4.2版本继承自YashanDB v23.4.1版本全部发布的功能,同时新增了以下关键特性:
# SQL引擎增强
# SQL功能增强
函数能力增强
XML函数
支持xmlagg函数:用于将多行数据合并为一个XML文档,在处理需要将多个记录组合成单个XML结构的场景中非常实用。
支持xmlparse函数:用于将文本字符串解析为XML数据类型,还可以指定wellformed关键字不对输入的XML进行格式检查。
支持xmltable函数:用于将XML数据解析为关系型数据,提取XML文档中的数据并转换为行和列的形式,以方便在SQL查询中使用。
支持getclobval函数:用于将XMLType数据转换为CLOB类型。
字符串函数
支持asciistr函数:用于将包含非ASCII字符的字符串转换为ASCII字符。
支持convert函数:将字符串从一个字符集转换为另一个字符集。
支持nls_lower函数:基于字符集特定转换规则,用于将字符串转换为小写。
支持to_clob函数:用于将其他数据类型转换为大对象类型,适用于存储超长文本、JSON数据等。
支持to_single_byte函数:用于将字符串中的多字节字符(例如全角字符)转换为等价的单字节字符(例如半角字符)。方便处理包含中日韩等字符集,对在处理需要兼容单字节字符集的场景有较大作用。
支持to_multi_byte函数:用于将字符串中的单字节字符(例如半角字符)转换为等价的多字节字符(例如全角字符)。与to_single_byte函数函数相反。
chr函数支持返回多字节字符:该版本之前,YashanDB的chr函数只支持ASCII对应的字符,即十进制0-127,该版本新增支持多字节字符,入参等价的二进制值对应的为有效的字符可以正常返回。
支持N'String'功能,是表示国家字符集字符串常量的特殊语法,用于处理Unicode数据和多语言环境下的字符串操作。
replace函数支持clob类型:replace函数将源字符串expr中所有的源字符串替换为目标字符串,返回VARCHAR类型的新字符串。在v23.4.1版本中,在源字符串expr超过32000字节时处理失败,为了扩大使用场景,该版本支持了对CLOB/NCLOB数据进行处理,实现支持更大处理规格。
trim函数从字符串中修剪前导或尾随字符(或两者),新增支持处理全角字符能力。
时间函数
支持at time zone函数:用于处理时区转换的表达式,可将时间戳值从一个时区转换到另一个时区。
支持from_tz函数:用于处理时区转换,将一个普通的时间戳(TIMESTAMP)与指定的时区信息组合,创建出带时区的时间戳(TIMESTAMP WITH TIME ZONE)。
支持to_timestamp_tz函数:用于将字符串转换为带时区信息的TIMESTAMP WITH TIME ZONE数据类型。
支持tz_offset函数:用于获取指定时区与UTC(协调世界时)之间偏移量的函数。
其他函数
支持rawtohex函数:用于将RAW类型的数据转换为十六进制字符串表示。将不可读的二进制数据转换为可读的十六进制格式,便于调试和分析。
支持ratio_to_report函数:属于分析函数,主要用于计算某个值相对于分组内所有值总和的比率,通过计算每个值在分组中的占比,可以直观地了解数据的分布特征。
支持unpivot函数:用于将多列数据合并为两列,一列用于存储原来的列名,另一列用于存储原来列中的值。
支持嵌套聚集函数:支持在一个聚集函数内部包含另一个聚集函数的表达式,用于在SQL查询中进行多层次的聚合计算,为复杂数据分析提供了灵活的手段。
支持dump函数:用于返回数据值的详细存储信息,包含数据类型代码、长度(以字节为单位)和expr的内部表示。返回的结果始终采用数据库字符集。
to_char/to_number函数支持FM修饰符:新增"Fill Mode"(填充模式),在format中使用FM字符,用于控制格式化输出中的空格和零填充。
支持ora_hash函数:生成数据的哈希值,常用于数据分片、采样和快速数据比较等场景。
语法功能增强
支持BFILE数据类型:用于存储在数据库外部的文件的引用,文件本身存储在操作系统的文件系统中。该版本主要实现表定义BFILE类型、bfilename函数和部分dbms_lob接口的计算适配。
支持MERGE INTO带子查询的单表功能,简化了SQL逻辑和语义。
支持使用VALUES引用子查询的字段或者变量插入,同时通过新增conditional_insert_clause子句语法,实现了基于特定条件判断是否插入的能力,但conditional_insert_clause不支持引用子查询的字段或变量。在该版本之前,YashanDB实现的INSERT ALL插入多表/多行数据时,只能选择INSERT ALL VALUES插入或INSERT ALL SELECT子查询插入,该版本实现了使用VALUES引用子查询的字段或变量插入。
table_reference子句支持子查询和带多表关联查询,即delete/update允许在修改或删除数据时基于其他表的查询结果作为条件,确保delete/update操作只影响符合特定关联条件的记录,提高数据间关联的正确性,常用于批量处理和数据清理。
SQL语句解析支持全角字符:在v23.4.2版本之前,YashanDB不支持在SQL或PL语句中使用全角字符,为了满足更多的使用场景,该版本新增了对常见的全角字符(包括
+、-、,、!、>、<、=、(、)以及空格)的解析,使用更灵活,且对涉及字符转换的SQL支持程度更高。聚合函数支持keep关键字功能:MIN、MAX、SUM、AVG、COUNT、VARIANCE和STDDEV等聚合函数支持KEEP关键字,可与FIRST或LAST函数结合使用,实现先对数据进行排序,然后对排序后的最前/后面N条记录数据执行聚合的复杂聚合效果,避免编写冗长的子查询,简化了SQL逻辑,并且可与多种聚合函数灵活使用。
PL能力增强
支持INSTEAD OF DML触发器:通过支持instead_of_dml_trigger子句,支持对非编辑视图的原操作进行拦截与替换执行开发者定义的操作逻辑,达到在数据库层实现复杂数据操作规则和业务逻辑封装的效果,实现复杂视图可更新和业务逻辑约束的功能效果。
UDT支持函数重载功能:YashanDB在v23.4.1版本支持了对存储过程和包中的存储过程的重载能力,为满足更多的使用场景,该版本实现对自定义类型中的函数重载功能,提高兼容性。
支持自定义聚集函数:通过实现AGGREGATE USING子句,将自定义函数标识为聚合函数,可将复杂聚合逻辑封装到一个自定义聚合函数中,简化代码逻辑。
支持update的returning功能:通过支持returning子句,实现在修改数据的同时返回被修改行的信息,简化常见的“先更新再查询”查询逻辑。配合BULK COLLECT子句使用批量返回被修改行的信息,可提升返回性能。
支持SUBTYPE功能:在PL中,支持通过SUBTYPE定义实现基于现有数据类型创建具有特定约束或语义的新数据类型,包含PL或SQL数据类型,可简化代码和增强代码可读性。
UDF支持DETERMINISTIC属性:在创建自定义函数时,通过新增指定DETERMINISTIC关键字,实现声明为确定性函数,即相同的输入参数总是返回完全相同结果。DETERMINISTIC函数在查询和调用的时候性能较好。
cast函数支持MULTISET关键字:用于将表达式的子查询计算为多行的结果集转换为集合类型值,实现复杂数据类型的转换。
支持把窗口函数返回集合作为自定义函数的入参进行处理,通常用于数据集级别而非单行级别进行复杂分析的场景,可达到实时分析和简化代码的效果。
支持CREATE CONTEXT功能:该版本支持CREATE CONTEXT功能用于存储和访问特定的应用程序或会话的属性信息。同时DBMS_SESSION系统包通过支持CLEAR_ALL_CONTEXT、CLEAR_CONTEXT、SET_CONTEXT函数,实现对CONTEXT的管理。
新增DBMS_ASSERT系统包,提供enquote_literal函数为输入的字符串添加引号,并对字符串中的引号进行转义,确保其能作为SQL语句中的有效文字常量使用,以此增强数据库应用程序的安全性,有效防止SQL注入攻击、目录遍历攻击等安全问题。
UTL_RAW系统包通过新增cast_to_nvarchar2函数,实现将使用一定数量的数据字节表示的RAW值转换为具有该数量数据字节的NVARCHAR2值。
DBMS_STATS系统包支持AUTO_SAMPLE_SIZE和AUTO_DEGREE常量:AUTO_SAMPLE_SIZE表示由数据库自动决定收集统计信息的采样率,AUTO_DEGREE表示由数据库自动决定统计信息收集的并行度,提高兼容性和易用性。
# SQL性能增强
并行能力增强
在表关联优化器使用NESTLOOP JOIN且不选择走索引扫描的的场景下,支持批量和并行执行。
在对分区表进行全分区扫描或分区剪枝优化时,执行阶段使用的分区扫描算子支持批量化和并行化。
在INSERT INTO SELECT大数据量的场景下,支持使用批量和并行执行提升插入性能。
RESULT算子支持批量化和并行化,在大数据量运算和结果集场景下可有效提升性能。
当SQL存在简单聚合(即不需要先分组再计算每组聚合)场景下,支持并行执行。
在SQL中存在子查询或视图且需要对其进行结果集扫描时的场景下,支持批量和并行执行。
新增常用的函数性能优化,例如NVL、LNNVL、CONCAT、ROUND、COALESCE,支持批量执行。
PL支持开启SQL并行:YashanDB持续优化PL的性能,该版本支持了PL中开启SQL的并行,在大数据量的全表扫、JOIN和DML的场景下,可以并行处理,提升效率。
PIPELINED管道函数支持RECORD类型和多PIPELINED执行:23.4.1版本实现PIPELINED管道函数,该版本对其能力增强,新增支持RECORD类型作为入参,同时在1个SQL中支持多个PIPELINE管道函数执行和计算。
算子优化
针对特定算子HASH JOIN INNER和HASH JOIN LEFT OUTER优化,该版本相较优化前性能提升1倍。
通过对like和instr函数处理nvarchar字符的算法进行优化,该版本相较优化前性能提升50%。
通过实现TOP N的堆排序算法,提升TOP N算子性能,在返回结果集较小的TOPN场景,使用纯内存的堆排序算法,可以使用较小的内存显著提升性能。
优化器增强
在SQL存在关联子查询时,优化器需要根据子查询的不同值的数量(NDV)进行评估,该版本优化了此场景计划生成的算法,可获取更精确的不同值的数量(NDV)评估决定是否需要减少子查询的执行次数,提高了适应性。
不同类型组Filter比较增加类型转换:在不同类型组的Filter,通常是执行阶段时进行隐式转换,但是存在使用不上索引的缺点。该版本YashanDB对优化器进行优化,在此场景下,显式增加一个类型转换函数,这样可以在特定场景下可以使用索引,增加查询效率。
集合操作中无效排序的删除:在集合操作中子查询不存在limit/rownum但存在ORDER BY等排序操作的场景下,优化器支持根据集合类型进行删除无效排序的等价重写,实现减少排序动作,提升集合操作效率。可以有效提升性能。
Filter常量和参数的优化:在filter any/all是常量列表时,则可以优化为对应的比较,例如any all改为对应的in。同时当in列表中常量和参数较大时,YashanDB进行了评估和改写规则的优化,降低计算复杂度和减少返回结果集。
Nestloop join支持右表为view:在SQL存在普通表和view关联时,支持优化器选择NESTLOOP关联,非驱动表为view的计划,同时支持谓词下推可走基表索引,从而提升查询性能。
增加数据库参数,控制DP支持的表个数:在多表关联的场景下,JOIN顺序无非是决定性能的主要因素之一,优化器使用动态规划算法产生的计划一般比遗传算法的计划好,但是资源消耗也更大,为了更好的适配动态规划算法可以支持的表数量范围,新增数据库参数MAX_DP_JOIN_TABLES,控制优化器使用动态规划算法的最大表数量,提高灵活性。
# 存储引擎增强
功能增强
支持GENERATED BY DEFAULT/ALWAYS AS IDENTITY功能:在该版本之前,表需要定义自增列时,只能通过创建sequence后关联到对应的列默认值上,该版本通过支持identity_clause子句,实现自动创建自增列的功能,提高了易用性,简化了自增列的创建步骤。
索引KEY支持最大规格对齐Oracle:在该版本之前,YashanDB索引KEY最大支持6000bytes,使用场景受限。该版本对索引KEY进行扩展,实现索引KEY最大规格随着block size的大小改变而改变,对齐Oracle规格。
主键约束支持与主键索引顺序不匹配:YashanDB支持使用ALTER TABLE USING INDEX语法可实现创建约束时指定已有索引,并且需要约束和指定的索引的列数量相同、列相同和顺序一致才能创建成功。该版本为了丰富使用场景,实现在约束和索引的列数量相等、列相同,但列顺序不同的场景下也可以创建成功,约束范围包含主键和唯一键。同时也提高了兼容性。
归档日志支持备份次数统计和基于次数条件备份和删除功能:为了满足不同业务场景的备份策略的诉求,该版本新增归档日志备份次数累加统计的能力,可以在V$ARCHIVED_LOG视图的BACKUP_COUNT字段查看归档日志的累加备份次数。新增了基于归档日志已备份次数的备份功能和自动删除策略,通过NOT BACKED UP integer TIMES子句指定备份归档时过滤(不进行备份)已备份达到integer及以上次数的归档文件;通过指定ARCHIVELOG_DELETION_POLICY参数为BACKED UP integer TIMES仅允许清理达到指定备份次数integer的归档日志。实现自由灵活的配置备份策略的诉求,同时能完整的备份归档日志,保证PITR所需文件。
CREATE INDEX支持COMPUTE STATISTICS语法:ALTER/CREATE INDEX新增COMPUTE STATISTICS子句语法兼容,但暂不支持功能。
性能优化
- 单列索引创建性能优化:新增支持并行创建function索引,同时对并行创建索引过程进行优化,实现在过程中多个分片进行扫描数据和排序,充分利用并行优势,大大缩短创建时间,该版本相较优化前性能提升1倍。
# 共享集群能力
高可用
支持VIP能力:该版本之前,共享集群仅支持直接使用物理IP对外提供业务访问,但是在实际业务中很多场景物理IP对外访问存在很大的安全和维护成本,同时在节点故障切换或恢复时驱动需要切换IP重连,增加了故障切时间换成本和应用感知。因此为了解决因节点故障物理IP管理相关问题,在v23.4.2版本共享集群提供了VIP能力,支持节点故障后本实例的VIP自动切换到存活节点,且切换不依赖,在存活节点可继续访问DB提供读写业务。在原故障节点恢复后VIP会自动回切到原节点,并且可以正常访问DB提供业务。
支持指定实例优先级的链接和切换:在一些共享集群使用场景中,会将相关的业务指定在某个或某几个集群实例运行,发生故障时通过指定的优先级切换顺序进行切换,既实现业务运行,同时共享集群相关实例互为主备,提高系统的容错和可用性。因此在v23.4.2版本在JDBC以及C驱动上实现通过指定实例优先级和切换,满足在共享集群使用中业务分离以及高可用管理能力。
支持共享集群自动failover:在v23.2版本中,共享集群已经支持主备场景下的手动failover,但在实际业务中很多的场景故障切换和管理要求比较高,手动切换以及管理需要一些其他运维配合,因此在v23.4.2版本支持自动failover切换,保证在主集群所有实例故障不可用的场景,实现自动的failover,降低系统故障时间减少RTO恢复时间。
支持主备集群离线升级:在v23.2版本中,共享集群已经支持主备离线升级,但未集成yasboot工具导致主备升级运维难度较大,因此在v23.4.2版本yasboot集成离线升级的所有运维命令,支持一键式完成整个离线升级流程,大大提升运维易用性和操作性。
YFS可靠性
该版本之前,在某个DG冗余度为Normal或High的情况下,若该DG的任一个副本故障,YFS会通过对该DG进行Dismount来保证数据的一致性(会导致整个DG不可用),该处理机制对业务可用性影响很大。因此在v23.4.2版本,YFS对多副本场景下的可靠性进行了优化,支持DG在任一个副本可用时始终可用且数据可靠,保障了共享集群对外持续可用能力,提升了产品可用性。
# 易用性
运维能力增强
支持SQL语句跟踪功能(10046事件):通过支持设置10046事件即SQL TRACE能力,例如'10046 TRACE NAME CONTEXT FOREVER, LEVEL 12',记录SQL语句执行过程中的统计信息,包括解析、执行、提取、提交、回滚、响应时间、服务时间、处理的行数、物理读和写的数目、执行计划以及其它额外信息。用于进行SQL跟踪,分析SQL在执行过程的消耗分布等执行细节和性能数据,有效帮助用户定位问题和优化SQL执行计划。
SLOWLOG支持打印完整的SQL和绑定变量:在高并发和存在大SQL的场景下,当SQL POOL大小不足够大时,很多SQL会快速被刷出缓存,且SLOWLOG打印的文本最大2000字节导致SQL不完整,使在定位问题时出现困难,该版本对SLOWLOG打印进行优化,支持在日志中打印SQL全文本,同时新增支持打印SQL的绑定变量,输出更多有效信息,提升诊断效率。
部署操作增强:
安装部署流程优化:支持在部署时提前检查和校验数据库参数、环境信息、服务器资源等是否匹配,避免在发起部署后由于依赖和异常项不满足而失败,提高易用性。
yasom自恢复:在该版本之前,yasom在异常自动切主后,查看数据库信息时可能会缺失之前异常节点的数据库信息,需要手动更新处理。该版本实现了自动修复,可自行获取各个节点信息,展示全部数据库信息,提高易用性。
重建备库、备份等操作预检查:在v23.4.2版本之前,在执行重建备库、备份等操作时,可能会出现因前置条件不满足导致发起长时间后执行失败,影响体验。该版本通过支持提前检查依赖和异常项,在使用yasrman备份恢复和使用yasboot进行备库异常重建时,会默认对相应操作所依赖项进行检查,实现备份恢复、创建/重建备库等操作在备份路径错误、恢复路径错误、重建备库时datafile未清理和build备库redo未清理等场景时可以提前报错,节省了用户时间,提高易用性。
性能报告能力增强:
在性能报告中新增展示数据库的缓存命中率和特定时间段内的SWAP使用情况的统计项,可以更直观和快速地获取有效信息。
在性能报告中新增对spinlock锁的统计项,主要添加尝试加锁的次数和加锁等待的次数的统计记录。可更精细化监控内存状态,用于性能问题诊断和瓶颈分析。
导数能力增强:
在v23.4.2版本之前YashanDB的工具在导入导出CSV文件时不支持使用多字符组合作为分隔符,该版本通过新增工具参数项允许用户自定义配置分隔符,支持多字符分隔符,适配更丰富的使用场景与习惯,提高易用性。
YashanDB在导出CSV文件时,字符类型数据必须指定包裹符或默认使用双引号包围,该版本支持导出字符类型时去掉包围符,兼容更多的CSV文件格式。
yasldr使用with embeded模式导入时,需要全部切分完数据后才能进行数据解析,导致prepare时间较长,该版本通过新增文件读取线程,加快文件读取切块,提升prepare效率,对比上一个版本提升性能30%左右。
yasql功能增强:
新增通过使用&占位符或SET define ON变量,在connect命令连接数据库时使用变量,实现交互式连接,增强安全和易用性。
支持ACCEPT命令功能,将输入值赋给指定的替代变量,从命令行界面获取用户输入,用于在yasql中接收用户输入的变量。
# 驱动
YashanDB在该版本对ODBC驱动能力增强和优化,通过在odbc.ini文件的URL列配置多个目标数据库IP端口,实现支持主备集群故障切换后自动连接到主库的能力。
ODBC驱动支持标量函数:
IFNULL:用于判断一个表达式是否为NULL,如果该表达式的值为NULL,则返回指定的替代值;如果不为NULL,则返回该表达式本身的值。
CONCAT:用于将多个字符串连接成一个字符串。它可以接受多个字符串作为参数,并按顺序将它们连接起来。
SUBSTRING:允许指定起始位置和长度,从一个字符串中截取一部分内容。
LEFT:在string_exp中从左至右截取n个字符长度的字符串。
# 兼容性变更
# 产品规格
| 规格名称 | 规格类型 | 变更类型 | 描述 | 语法模式 | 产品形态 |
|---|---|---|---|---|---|
| 索引键值 | 最大值 | 变更 | 由固定6000Bytes修改为取决于数据块大小(对齐Oracle) * 8K:6400Bytes * 16K:12960Bytes * 32K:26510Bytes | yashan模式、mysql模式 | 单机部署、共享集群部署、存算一体分布式集群部署 |
| SQL语句中常量字符串输入长度 | 最大值 | 变更 | 由16000Bytes修改为65534Bytes | yashan模式 | 单机部署、共享集群部署、存算一体分布式集群部署 |
| BIT类型 | 数据类型 | 变更 | 暂不支持BIT类型 | mysql模式 | 单机部署 |
# 系统配置参数
| 配置参数 | 修改类型 | 描述 | 语法模式 | 产品形态 |
|---|---|---|---|---|
| SESSION_MAX_OPEN_FILES | 变更 | 该参数功能由用于控制单个会话使用UTL_FILE包打开的文件数变更为用于控制单个会话打开的BFILE文件数 UTL_FILE包打开的文件数规格无变化(小于等于50) | yashan模式 | 单机部署、共享集群部署 |

