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

本文介绍了PolarDB PostgreSQL版(兼容Oracle)2.0版本相较于PolarDB PostgreSQL版(兼容Oracle)1.0版本的差异说明。

概述

相较于PolarDB PostgreSQL版(兼容Oracle)1.0版本,PolarDB PostgreSQL版(兼容Oracle)2.0版本基于新的兼容性架构,以兼容Oracle语法为基准进行开发。

PolarDB PostgreSQL版(兼容Oracle)2.0版本对PostgreSQL在分布式负载前提下的高并发、高写入负载、并行查询和逻辑复制等方面的性能相比于PolarDB PostgreSQL版(兼容Oracle)1.0版本有了进一步提升。

本文详细描述了两个版本的具体区别,供您参考。请以目前发布的PolarDB PostgreSQL版(兼容Oracle)2.0版本(20230930)为准,部分特性将在随后的版本中逐步支持。

产品性能和功能特性

性能显著提升

使用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%

说明

性能测试中的参数均保持一致,其中参数polar_enable_stmt_transaction_rollbackpolar_default_with_rowid设置为off,其余参数使用默认值。

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

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

索引增强

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

分区表提升

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

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

并行VACUUM(垃圾回收)

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

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

查询优化

PolarDB PostgreSQL版(兼容Oracle)2.0版本引入了增量排序,其中查询中较早步骤的排序数据可以加速后续步骤的排序。这一优化措施可以显著提高查询的性能和效率。

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

PolarDB PostgreSQL版(兼容Oracle)2.0版本支持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对象的只读或只写权限,为用户提供更加灵活的数据管理方式。

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

主要功能

PolarDB PostgreSQL版(兼容Oracle)2.0版本高度兼容Oracle语法,支持Oracle常见语法特性以及分区表、事务能力、PL/SQL、包、异构连接等重要功能,并且进一步提升了高并发、高写入负载、并行查询和逻辑复制等方面的性能。

PolarDB PostgreSQL版(兼容Oracle)2.0版本主要的Oracle兼容性功能如下:

支持Oracle兼容的字符串类型、数字类型、二进制类型、支持64位的Date类型存储

PolarDB PostgreSQL版(兼容Oracle)2.0版本扩展支持64位的Date类型存储,支持Oracle兼容的年、月、日、时、分、秒级别的Date类型存储及展示。支持char/varchar2/nvarchar2/nvarchar/binary_integer/number/row/rowid等类型,支持nls_date_formatnls_timestamp_format来控制时间类型的输出格式。

支持Oracle兼容的一系列操作符

PolarDB PostgreSQL版(兼容Oracle)2.0版本支持decodegroup_id操作符;支持聚合函数中的order by操作符;支持在内置二元操作符中间添加空格;支持minus集合操作符、支持a.b形式的函数不带括号调用;支持空串视为NULL。

支持Oracle兼容的字符串函数、数字函数、二进制函数、正则函数、采样函数、聚合函数

PolarDB PostgreSQL版(兼容Oracle)2.0版本支持to_date/add_month等一系列时间类型内置的函数;支持instr/lpad/rpad等一系列字符串内置函数;支持rawtohex/hextoraw/vsize等一系列二进制相关函数;支持sys_guid等编码内置函数;支持sample function等采样函数;支持regexp_count/regex_instr/regex_substr/regex_like等一系列正则函数。支持Oracle兼容风格的聚合函数创建。

支持Oracle兼容的别名、列名、子句、视图

PolarDB PostgreSQL版(兼容Oracle)2.0版本支持在不同层级的子查询中使用相同别名、支持表名、列名称大小写兼容、支持关键字别名全兼容;insert/select的语法结构中支持使用别名;支持目标列中默认的distinctorder by子句;支持order by子句中的count(*)聚集函数;支持merge子句中update/delete语法与where并联使用;支持insert/update后跟形如namespace.table.col语法;支持(+)表连接操作符。

支持ALL_PART_KEY_COLUMNS/USER_PART_KEY_COLUMNS/DBA_PART_KEY_COLUMNS/DBA_ROLE_PRIVS/USER_ROLE_PRIVS等Oracle常用的视图。

支持Oracle兼容的伪列、序列、DML、DDL等相关语法特性

PolarDB PostgreSQL版(兼容Oracle)2.0版本支持rownum语法来标志查询结果中的行号;支持全局唯一的序列;支持select/delete/update作用于子查询的语法;支持select for update wait语法;支持merge into语法在视图中使用;支持基本的HINT语法;支持Rename To语法;支持alter table add (col1, col2)语法;支持create directory语法;支持create context语法;支持connect by子句在执行分层查询时确定行的父子关系。

支持Oracle兼容的分区表创建、修改、扩展功能

PolarDB PostgreSQL版(兼容Oracle)2.0版本支持Oracle风格的分区表,包括一级、二级分区的创建,支持List、Range、Hash三种分区的创建。支持常见的CREATE、COALESCE、DROP、EXCHANGE、MERGE、MODIFY、MOVE、RENAME、SPLIT、TRUNCATE等分区管理操作。支持分区表子模板分区、支持间隔分区自动创建、支持Oracle兼容的如同A PARTITION(B)的分区调用。

数据库事务CSN事务快照机制、支持自治事务、支持语句级别事务回滚

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

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

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

支持Oracle兼容的PL/SQL块行为

PolarDB PostgreSQL版(兼容Oracle)2.0版本支持PL/SQL不带$$符号调用;函数/存储过程支持IN、OUT、INOUT参数,用于对参数进行值的引用传递;匿名块支持变量绑定和两阶段运行;支持constant变量兼容;支持隐式声明的record类型循环变量;支持存储过程中的:NEW/:OLD语法现象 ;支持触发器中使用无返回值;支持自定义Exception变量;支持Trigger触发器中的beginend语法。

支持Oracle兼容的包功能及集合类型

PolarDB PostgreSQL版(兼容Oracle)2.0版本支持自定义包功能的创建和删除;支持常见的关联数组、嵌套表、可变长的数组等集合类型;支持集合类型的基本初始化、调用、赋值等操作。

支持Oracle兼容的内置包

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

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

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

  • DBMS_APPLICATION_INFO包来记录数据库中正在执行的模块或事务的名称,以供以后跟踪各种模块的性能和调试时使用。

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

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

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

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

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

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

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

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

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

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

  • DBMS_SQL包提供了使用动态SQL执行数据操作语言 (DML) 和数据定义语言 (DDL) 语句、执行 PL/SQL匿名块以及调用PL/SQL存储过程和函数的接口。

  • DBMS_UTILITY包提供了各种实用子程序。

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

  • UTL_I18N包提供了一组由ESCAPE_REFERENCE和UNESCAPE_REFERENCE函数组成的服务,可以为PL/SQL编写的应用程序提供附加的全球化功能。

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

持久化缓冲池与DBLink

PolarDB PostgreSQL版(兼容Oracle)2.0版本中数据库崩溃、重启后原BufferPool内容不会丢失,待下次程序启动可以复用之前的Bufferpool内存信息。

支持DBKLink功能,支持使用DBLink连接PostgreSQL数据库、Oracle数据库。

支持服务端GBK、GB18030编码

PolarDB PostgreSQL版(兼容Oracle)2.0版本支持服务端使用GBK、GB18030编码,降低在客户端GBK环境下额外的编码转换成本。

2.0版本相较于1.0版本语法兼容性差异说明

数据类型和伪列

  • 不支持ABSTIME类型。

  • 不支持COLUMN_VALUE伪列。

DDL语法

  • 不支持CREATE USER后使用PROFILE/PASSWORD EXPIRE/CREATE DBLINK等语法。

  • 不支持ALTER USER USERNAME后使用NO EXEMPT ACCESS POLICY语法。

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

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

  • 不支持SHOW ROLE语法。

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

  • 不支持CREATE/DROP/ALTER PROFILE/QUEUE/QUEUE TABLE语法。

视图和分区表

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

  • 不支持对CREATE OR REPLACE视图进行列重命名。

  • 不支持DBA_PROFILES视图。

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

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

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

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

函数、存储过程及触发器

  • 不支持CREATE FUNCTION/PROCEDURE后使用PIPELINED/DETERMINISTIC语法,不支持ALTER PROCEDURE后使用STRICT语法。

  • 不支持函数和过程具有相同的名称。

  • 不支持函数和过程的参数是子查询。

  • 不支持TO_CHAR函数使用YYyy格式表示年份、Mi格式表示分钟、ff[7-9]格式输出秒,在未指定年份的情况下使用DDD格式。

  • 不支持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_PROFILERDBMS_SCHEDULE内置包。

  • 不支持UTL_FILEUTL_HTTPUTL_SMTPUTL_URL内置包。

  • 不支持在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及集合类型

  • 不支持的错误码:INVALID_CURSOR/INVALID_NUMBER/NO_DATA_FOUND/VALUE_ERROR

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

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

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

  • 不支持在存储过程中使用%type%rowtype来声明局部函数的输入参数。

  • 不支持集合操作和集合判断,不支持直接初始化关联数组。

  • 不支持二维集合类型。

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

  • 不支持将关联数组用作参数类型。

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

  • 不支持在RECORD变量中包含集合类型的字段。

  • 关联数组变量默认被初始化为空而不为NULL,且不允许被赋值为NULL