PolarDB PostgreSQL(兼容Oracle)2.0版本与1.0版本差异说明

PolarDB PostgreSQL版(兼容Oracle)2.0版本相较于1.0版本,基于全新的兼容性架构,以兼容Oracle语法为开发基准。2.0版本在分布式负载条件下的高并发、高写入负载、并行查询及逻辑复制等性能方面,相较于1.0版本,获得了显著提升。本文将详细描述两个版本之间的具体区别,供您参考。请以目前发布的PolarDB PostgreSQL版(兼容Oracle)2.0版本(20250630)为准,部分特性将在后续版本中逐步支持。

性能显著提升

使用pgbench进行只读场景(select-only)与读写场景(tpcb-like)的性能测试,采用的集群规格为polar.o.x8.xlarge,测试数据如下:

场景

PolarDB PostgreSQL版(兼容Oracle)1.0版本

PolarDB PostgreSQL版(兼容Oracle)2.0版本

性能提升

只读场景(select-only)

109141.30

120803.95

10.69%

读写场景(tpcb-like)

49226.71

64752.41

31.54%

PolarDB PostgreSQL版(兼容Oracle)2.0版本相比于1.0版本在性能方面有了显著的提升,特别是在tpcb-like的读写场景压力下,性能提升了超过30%。此外,在存在大量连接的场景下,PolarDB PostgreSQL版(兼容Oracle)2.0版本大幅提高了事务吞吐量,在测试场景下最高可提升1倍。

为了进一步提高性能,2.0版本增加了许多并行查询功能。例如,PL/pgSQL函数内的RETURN QUERY返回结果时支持QUERY的并行计算,REFRESH MATERIALIZED VIEW命令也可以使用并行查询。此外,支持并行顺序扫描chunk,提高大范围数据扫描的IO吞吐,使其接近块设备的IO吞吐极限。

索引增强

PolarDB PostgreSQL版(兼容Oracle)2.0版本在处理B树索引(标准数据库索引)中的重复数据方面进行了有效优化,从而降低了B树索引的总体空间使用量,同时提高了总体查询性能。具体而言,该版本通过引入去重技术的索引压缩策略,可以自动去重并压缩B树索引中的重复数据,从而减少索引占用的空间。同时,2.0版本还解决了B-树索引的资源消耗问题,包括频繁更新索引导致的表膨胀问题。

此外,该版本还提供了GiST索引,在构建过程中预先排序数据,从而可以大幅提高GiSTSP-GiST索引的创建速度,并减少索引的大小。

分区表提升

PolarDB PostgreSQL版(兼容Oracle)2.0版本通过改进分区系统,使得使用分区表进行查询时获得了更好的性能提升。现在,您可以使用更灵活的分区裁剪和智能JOIN。此外,该版本还增强了对于触发器的支持,同时增加了逻辑复制的支持,使得数据复制和同步更加高效可靠。

此外,2.0版本优化了分区裁剪能力,减少了子分区SubPlan和重复的cached plans,从而可以更快地执行查询操作。同时,在增减分区时使用alter table detach|attach PARTITION concurrently模式,避免了锁冲突,提高了数据库的可用性和稳定性。

并行VACUUM(垃圾回收)

ACUUM机制在PolarDB PostgreSQL版(兼容Oracle)2.0版本的数据库管理中非常重要,能够释放掉已经不再使用的表空间,以缓解常见的表膨胀问题。为了进一步优化垃圾回收的效率和性能,2.0版本引入了并行的索引回收机制。此外,您还可以自行指定并行工作者的数量,以便更好地满足需求。

通过这些优化措施,PolarDB PostgreSQL版(兼容Oracle)2.0版本的数据库管理具备更高的效率、可靠性和稳定性,使得您可以更加轻松地进行数据管理和维护工作。

查询优化

  • 引入了增量排序,其中查询中较早步骤的排序数据可以加速后续步骤的排序。这一优化措施可以显著提高查询的性能和效率。

  • 增加了更多类型的聚合和分组集查询,能够利用PostgreSQL高效的哈希聚合功能。这意味着具有大型聚合的查询不必完全装入内存,从而大幅降低内存使用和I/O开销。

  • 支持linear search TO hash table probe,可以显著提升IN语句的处理性能。特别是在多条件或需要过滤大量数据的SQL中,性能提升更为显著。

支持LZ4压缩算法及安全特性增强

PolarDB PostgreSQL版(兼容Oracle)2.0版本引入了多项新功能,包括支持您选择LZ4算法进行数据列压缩,以提高压缩性能,同时仍保留对原来pglz压缩方式的支持。此外,还可以通过使用pg_read_all_datapg_write_all_data两个预定义的角色,实现一次性授权tables/views/sequences对象的只读或只写权限,为您提供更加灵活的数据管理方式。

2.0版本采用了对象权限粒度的云上权限管理,保障数据安全性和可靠性。这一优化措施可以帮助用户更好地保护敏感数据,避免数据泄露和安全漏洞。

核心功能特性

数据类型兼容性

Oracle标准数据类型全面支持

  • PolarDB PostgreSQL版(兼容Oracle)2.0版本扩展支持了64位的Date类型存储,完全兼容Oracle的年、月、日、时、分、秒级别的Date类型存储及展示。

  • 支持charvarchar2nvarchar2nvarcharbinary_integernumberrowrowidOracle标准类型,并提供nls_date_formatnls_timestamp_format来控制时间类型的输出格式。

  • 在数值计算方面,INT2INT4INT8类型的除法结果都为浮点数,提升了数值计算与Oracle行为的兼容性。

增强的JSONXML类型支持

  • 支持JSON_ELEMENT_TJSON_OBJECT_TJSON_ARRAY_T类型,增强JSON数据处理的灵活性,以及更复杂的JSON操作场景。

  • 支持XMLELEMENTXMLAGG返回XmlType类型,便于生成和操作XML数据。

  • 支持XmlTypeextractgetStringVal函数,扩展XML数据处理能力。

  • 支持ROW类型NULL/NOT NULL约束校验,ODCI类型扩展,以及复合类型与带默认值的record类型的转换功能。

函数与操作符兼容性

丰富的Oracle兼容函数库

  • 支持decodegroup_id操作符,聚合函数中的ORDER BY操作符,内置二元操作符中间添加空格,minus集合操作符,a.b形式的函数不带括号调用,空串视为NULLOracle特有特性。

  • 支持时间函数包括to_dateadd_month等时间类型内置函数。

  • 支持字符串函数包括instrlpadrpad等字符串内置函数。

  • 支持二进制函数包括rawtohexhextorawvsize等二进制相关函数。

  • 支持正则函数包括regexp_countregex_instrregex_substrregex_like等正则函数。

函数兼容性持续增强

  • 新增JSON_OBJECTJSON_ARRAYAGG函数,优化JSON数据处理。

  • 支持XMLELEMENTXMLAGG使用.function调用,提升XML复合操作灵活性。

  • 支持CONVERT(date,name,name)NVL(interval, interval)内置函数,用于处理日期和间隔类型的数据。

  • 升级TO_DATE/TO_CHAR函数syyyy格式处理,保证日期处理准确性。

  • 支持函数OUT参数时嵌套隐式类型转换,扩展XMLSEQUENCE函数XML数据处理能力。

  • 支持USERENV函数管理会话环境信息。

SQL语法兼容性

查询语法全面兼容

  • 支持在不同层级的子查询中使用相同别名,表名、列名称大小写兼容,关键字别名全兼容。

  • INSERT/SELECT的语法结构中支持使用别名,支持目标列中默认的DISTINCTORDER BY子句,支持ORDER BY子句中的COUNT(*)聚集函数。

  • 支持INSERT/UPDATE后跟形如namespace.table.col语法,支持(+)表连接操作符。

  • 支持MERGE子句中UPDATE/DELETE语法与WHERE并联使用。

伪列和DML语法增强

  • 支持ROWNUM语法来标志查询结果中的行号,以及ROWNUM带引号状态下的调用。

  • 支持全局唯一的序列。

  • 支持SELECT/DELETE/UPDATE作用于子查询的语法。

  • 支持SELECT FOR UPDATE WAITSELECT FOR UPDATE ORDER BY语法。

  • 支持MERGE INFO语法在视图中使用。

  • 支持基本的HINT语法。

  • 支持CONNECT BY子句在执行分层查询时确定行的父子关系。

  • 支持在视图和表中使用EDITIONABLE关键字。

  • 支持TEXT类型和其他类型进行UNION操作。

DDL语法兼容性

表和对象管理语法

  • 支持ALTER SESSION ENABLE语法用于控制会话的行为。

  • 支持创建表时生成列语法以及部分特殊的关键字。

  • 支持MONITORING关键字用于跟踪表的使用情况。

  • 支持ALTER TYPE ADD(ATTRIBUTE)语法增强对象类型管理的灵活性。

  • 支持REFRESH COMPLETE语法用于更新物化视图数据。

  • 支持WITH CHECK OPTION强制视图约束。

  • 支持手动创建物化视图的循环依赖。

  • 支持DROP FORCE强制删除同义词。

安全和权限管理

  • 支持CREATE PROFILE功能,提供密码复用次数、时间与密码验证函数等功能,显著提升数据库安全性。

  • 支持CREATE TABLE CACHE语法优化数据缓冲策略。

  • 系统触发器支持ALTER TRIGGER ENABLE/DISABLE语法。

  • 支持在PUBLIC SCHEMA下创建PUBLIC同义词,且支持PACKAGETYPE BODY的同义词。

  • 支持MODIFY COLUMN语法。

  • 支持通过DROP AGGREGATE方式删除聚合函数。

分区表功能

完整的分区表支持

  • 支持Oracle风格的分区表,包括一级、二级分区的创建,以及LISTRANGEHASH三种分区类型。

  • 支持常见的CREATECOALESCEDROPEXCHANGEMERGEMODIFYMOVERENAMESPLITTRUNCATE等分区管理操作,

  • 支持分区表子模板分区、间隔分区自动创建、Oracle兼容的A PARTITION(B)分区调用语法。

高级分区特性

  • 支持自动添加分区表索引功能。当需要建立全局索引时,支持不显式使用GLOBAL的调用方式,并且允许在分区表的触发器中使用REFERENCING OLD语法。

  • 支持在分区表中使用Interval分区,并与Global Index配合使用。

  • 允许将分区表中的MAXVALUE分区转换为DEFAULT分区,以便接受分区键上的空值。

  • 修复了分区表创建过程中的相关稳定性问题及分区表视图查询中的缺陷。

事务处理能力

CSN事务快照机制

PolarDB PostgreSQL版(兼容Oracle)2.0版本引入了一种新的事务快照机制,即CSN事务快照机制,用于提升MVCC的性能。与原生PostgreSQL采用xid事务号列表作为事务快照不同,CSN快照使用一个单调递增的64位整数值,这不仅加速了事务快照的生成,还提升了MVCC中行可见性判断的性能。

自治事务和语句级回滚

  • 支持在存储过程、匿名块中使用自治事务,使得该事务的提交状态独立于父事务。

  • 支持语句级事务回滚,在关闭自动提交的前提下,语句级别的错误只会回滚当前子事务,而保留主事务运行状态。

这些功能为复杂业务场景提供了更灵活的事务控制机制。

触发器功能

  • 支持DDL系统触发器,便于处理DDL操作相关触发器。

  • 支持ALTER TRIGGER ENABLE/DISABLE管理系统触发器,便于控制触发器的行为。

  • 支持Schema/Database级别的DDL系统触发器,便于处理相应级别的DDL操作。

  • 支持触发器子函数调用updating('col')语法,便于处理复杂的触发器逻辑。

PL/SQL编程支持

基础语法兼容

  • 支持PL/SQL不带$$符号调用。

  • 函数/存储过程支持INOUTINOUT参数,用于对参数进行值的引用传递。

  • 匿名块支持变量绑定和两阶段运行。

  • 支持constant变量兼容。

  • 支持隐式声明的record类型循环变量。

  • 支持存储过程中的:NEW/:OLD语法现象。

  • 支持触发器中使用无返回值。

  • 支持自定义Exception变量。

高级PL/SQL特性

  • 支持PROGRAM_ERROR异常语法。

  • 支持子函数recfield字段存在性检查。

  • 支持FOR row IN循环语句。

  • 支持使用record数组作为函数参数。

  • 支持SQL层保留关键字作为函数名。

  • 支持PL层使用collectreverse作为存储过程名。

  • 支持goto loop语法。

  • 支持在PL块的子查询中使用包变量。

  • 支持在函数中使用func.var调用函数声明的变量。

子函数功能

  • 支持子函数使用外部变量作为参数默认值,简化变量传递逻辑。

  • 支持触发器的子函数使用:new/:old,增强触发器子函数兼容性。

  • 支持子函数中的集合类型元素使用外部变量。

  • 支持包中子函数使用包中私有函数,保证包内资源统一调度。

  • 支持在子函数中使用包变量。

  • 支持子函数使用默认的排序规则执行。

  • 支持在包子函数中使用外部变量。

  • 支持调用子函数下的变量。

游标功能

  • 支持使用=>指定游标参数默认值。

  • 支持无参数游标的open cursor()语法,简化游标初始化逻辑。

  • 支持定义游标时指定参数默认值。

  • 支持cursor%rowtype指定函数参数类型。

  • 支持在ROLLBACK后使用持久化游标,拓展数据查询延续性。

  • 支持默认非滚动式游标,降低内存占用优化执行性能。

  • 支持包函数中的游标使用包中其他函数。

  • 支持在游标的子查询中使用包变量。

  • 支持显式游标重复打开。

包(Package)功能

  • 支持自定义包功能的创建和删除。

  • 支持常见的关联数组、嵌套表、可变长的数组等集合类型。

  • 支持集合类型的基本初始化、调用、赋值等操作。

  • 支持包中一维SUBTYPE,扩展包的数据模型支持。

  • 包中record支持constraint,确保数据完整性。

  • 支持包忽略大小写访问。

  • 支持包函数依赖后续定义的类型。

  • 支持包函数存储过程忽略默认值。

  • 支持使用包变量指定包函数参数类型。

  • 支持包变量作为存储过程变量和子函数参数默认值。

集合类型支持

  • 支持使用关联数组作为参数和返回值,便于处理复杂的数据结构。

  • 支持变长数据等价声明,简化集合类型空间管理逻辑。

  • 支持集合类型范围删除。

  • 支持内置包内置关联数组。

  • 支持三维关联数组,扩展了集合类型的功能。

  • 支持关联数组元素为二维record,增强复合类型表达,且支持与record嵌套。

  • 支持fetch bulk intocoll(idx).recfield集合类型,优化DML执行效率。

  • 支持在DML语句中使用高维集合类型。

  • 支持集合类型的函数参数默认值。

  • 支持关联数组构造器。

  • 支持集合类型的转换操作和集合操作。

内置包生态

PolarDB PostgreSQL版(兼容Oracle)2.0版本提供了丰富的Oracle兼容内置包,涵盖了企业级应用的各个方面:

  • DBMS_AQ:提供消息队列入队、出队操作的函数。

  • DBMS_AQADM:提供消息队列的配置和管理功能。

  • DBMS_ALERT:提供一组存储过程,用于注册警报、发送警报和接收警报。

  • DBMS_APPLICATION_INFO:记录数据库中正在执行的模块或事务的名称,用于性能跟踪和调试。

  • DBMS_CRYPTO:提供对存储数据进行加密、解密的功能,支持AES、DES、哈希以及消息摘要等功能。

  • DBMS_DDL:便于处理DDL相关的操作。

  • DBMS_JOB:用来创建和管理定时任务,用户可以提交定时任务在数据库中定时执行。

  • DBMS_LOB:提供对大对象的访问和操作方式,包括BLOBCLOB等。

  • DBMS_LOCK:提供将当前会话暂停一段时间的SLEEP内置函数。

  • DBMS_METADATA:提供获取数据库对象的元数据信息的方法,用于重建数据库中的对象。

  • DBMS_MVIEW:支持在REFRESH时不包含依赖的对象。

  • DBMS_OUTPUT:可以从存储过程、包或触发器发送信息。

  • DBMS_XMLGEN:提供convert函数,便于处理XML数据转换。

  • DBMS_XMLPARSER:提供对XML文档的解析方法,可以用于生成Document对象。

  • DBMS_PIPE:支持同一例程在不同会话之间进行管道通信。

  • DBMS_RANDOM:提供一系列随机函数、存储过程。

  • DBMS_REDACT:提供对低权限用户或应用查询的数据进行脱敏处理的函数,保护数据库数据安全。

  • DBMS_RLS:可以使虚拟私有数据库VPD执行于特定的PolarDB数据库对象上。

  • DBMS_SESSION:提供从PL/SQL访问会话、用户以及其他信息的接口。

  • DBMS_SPACE:便于处理空间管理相关的操作。

  • DBMS_SQL:提供使用动态SQL执行DMLDDL语句、执行PL/SQL匿名块以及调用PL/SQL存储过程和函数的接口。

  • DBMS_TRANSACTION:用于处理事务相关的操作。

  • DBMS_UTILITY:提供各种实用子程序、包获取依赖。

  • DBMS_XMLDOM:提供对XML文档的DOM访问接口,支持定义以及生成多种DOM对象。

  • UTL_ENCODE:提供一组进行数据编解码的函数,方便数据在不同主机之间的传输。

  • UTL_I18N:提供ESCAPE_REFERENCEUNESCAPE_REFERENCE函数组成的服务,为PL/SQL编写的应用程序提供附加的全球化功能。

  • UTL_MATCH:增强字符串模式匹配功能,简化文本操作流程。

  • UTL_HTTP:拓展Web交互功能。

  • UTL_RAW:提供用于操作RAW类型数据的函数。

  • UTL_TCP:强化TCP通信功能,扩展网络传输场景。

  • UTL_URL:提供转换URL中的非法字符和保留字符的方法。

系统视图兼容性

  • 支持ALL_PART_KEY_COLUMNSUSER_PART_KEY_COLUMNSDBA_PART_KEY_COLUMNSDBA_ROLE_PRIVSUSER_ROLE_PRIVSOracle常用的视图。

  • 支持DBA_COL_COMMENTS视图,用于查看和管理列注释信息。

  • 支持nls参数视图,扩展国际化参数的支持,增强多语言配置管理。

  • 支持全参数的DBA_TAB_COLUMNS视图,提供更全面的表列信息。

  • 支持SESSION_ROLE内置视图,扩展会话角色管理的功能。

  • 支持USER_TAB_PARTITIONS视图HIGH_VALUE字段,优化分区表高值管理。

  • 支持DBA_OBJECTS视图CREATED字段,用于查看对象的创建时间。

其他高级功能特性

DBLink异构连接

支持DBLink功能,可实现与PostgreSQL数据库和Oracle数据库的连接。此功能为您提供了跨数据库访问的能力,便于数据集成和迁移场景的实施。

字符编码支持

支持服务端使用GBKGB18030编码,以降低在客户端GBK环境下的额外编码转换成本。这一特性特别适用于中文环境下的应用场景,增强了系统的本地化支持能力。

语法兼容性差异说明

PolarDB PostgreSQL版(兼容Oracle)2.0版本相较于1.0版本,存在以下差异:

类型

说明

数据类型

不支持ABSTIME类型。

DDL语法

  • 不支持DROP USER后使用CASCADE语法。

  • 不支持GRANT EXEMPT ACCESS POLICY TO USERNAME语法。

  • 不支持SHOW ROLE语法。

  • 不支持CREATE INDEX后使用NOLOGGING语法。

视图和分区表

  • 部分Oracle兼容视图的定义中不存在SCHEMA_NAME列。

  • 分区表的父表会默认至少有一个子分区。

  • 不支持在非DEFAULT分区中上插入空值。

  • 不允许对HASH分区进行ATTACH操作。

  • 对于LIST类型的分区表,如果包含了默认分区,则不允许进行ADD分区操作。

函数、存储过程及触发器

  • 不支持函数和存储过程具有相同的名称,且不支持函数和存储过程的参数是子查询。

  • 不支持REGEXP_REPLACE函数的第四个输入参数为'n'

  • 不支持DECODE函数只有两个参数输入,不支持字符参数上使用COLLATE修饰。

  • 不支持函数GET_RAW_PAGE双引号作为第一个参数。

  • 不支持将ROWNUM作为函数参数。

  • 如果存储过程没有ANYELEMENT类型的输入,则输出中不能有ANYELEMENT类型。

  • SQL函数中,如果参数具有默认值,则后续的参数也必须具有默认值。

  • 触发器名称长度限制为54个字符。

事务

如果自治事务中发生了写操作,必须显式提交或回滚事务来结束,否则事务会失败。

SQL查询

  • 不支持以下优化方式:CHOOSE/FIRST_ROWS/FIRST_ROWS_10/FIRST_ROWS_100/FIRST_ROWS_1000

  • 不支持在子查询中使用同义词来调用父查询中的对象。

  • 不支持在INSERT ALL INTO xxxSELECT xxx之间没有VALUES xxx的语法。

  • 不支持使用DUAL表中的DUMMY列与数值类型进行比较操作。

  • 不支持使用'!!a'来表示a的阶乘。

  • 不支持在非不变函数中调用其他函数。

  • 不支持在创建COLLATION时将ICU_SHOR_FORM置为'AN_CX_EX_LROOT_NO_S3'

  • 不支持使用BIT 类型为BOOL类型赋予默认值。

  • 不支持使用列来为其他列赋予默认值。

  • 不支持在SQL层面使用包变量。

  • 不支持在DBMS_SQL包中使用DBMS_SQL.TO_REFCURSORDBMS_SQL.TO_CURSOR_NUMBER

  • 不支持在DBMS_SQL包中使用SELECT INTO语句,不支持对非SELECT语句使用DEFINE_COLUMN,不支持使用DBMS_SQL.NATIVE常量进行赋值。

  • 不支持在DBM_UTILITY包中将纯数字作为表名,不支持使用NULL作为GET_HASH_VALUE输入参数。

  • 不支持在DBMS_CRYPTO包中,在RANDOMBYTES中使用0作为输入参数。

  • 不支持在UTLRAW包中SUBSTR函数将起始位置设置为超出RAW总长度的值。

  • 不支持在DBMS_PIPE包中SEND_MESSAGE函数中TIMEOUT参数使用负数。

  • 不支持DBMS_RLS策略函数返回NULL

  • 不支持在DBMS_LOB包的INSTR函数中使用负数作为输入参数。

PL/SQL及集合类型

  • 不支持在非异常状况下调用SQLCODESQLERRM

  • 不支持强类型游标绑定的动态SQL。

  • 不支持在带参数的动态SQL中执行DDL操作。

  • 不支持将STRINGLONG类型用作关联数组的索引类型。

  • 不支持在全局范围内对集合类型声明非空属性。