本文介紹了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_rollback
與polar_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_data
和pg_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_format、nls_timestamp_format來控制時間類型的輸出格式。
支持Oracle兼容的一系列操作符
PolarDB PostgreSQL版(兼容Oracle)2.0版本支持decode
、group_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
的語法結構中支持使用別名;支持目標列中默認的distinct
、order 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觸發器中的begin
、end
語法。
支持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 xxx
和SELECT xxx
之間沒有VALUES xxx
的語法。不支持使用
DUAL
表中的DUMMY
列與數值類型進行比較操作。不支持使用
'!!a'
來表示a的階乘。不支持在非不變函數中調用其他函數。
不支持在創建
COLLATION
時將ICU_SHOR_FORM
設置為'AN_CX_EX_LROOT_NO_S3'
。不支持使用
BIT
類型為BOOL
類型賦予默認值。不支持使用列來為其他列賦予默認值。
包
不支持在SQL層面使用包變量。
不允許只聲明包頭而不聲明包體來使用包。
不支持
DBMS_PROFILER
、DBMS_SCHEDULE
內置包。不支持
UTL_FILE
、UTL_HTTP
、UTL_SMTP
、UTL_URL
內置包。不支持在
DBMS_SQL
包中使用DBMS_SQL.TO_REFCURSOR
和DBMS_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
。不支持在非異常狀況下調用
SQLCODE
和SQLERRM
。不支持強類型游標綁定的動態SQL。
不支持在帶參數的動態SQL中執行DDL操作。
不支持在存儲過程中使用
%type
或%rowtype
來聲明局部函數的輸入參數。不支持集合操作和集合判斷,不支持直接初始化關聯數組。
不支持二維集合類型。
不支持將
STRING
或LONG
類型用作關聯數組的索引類型。不支持將關聯數組用作參數類型。
不支持在全局范圍內對集合類型聲明非空屬性。
不支持在
RECORD
變量中包含集合類型的字段。關聯數組變量默認被初始化為空而不為
NULL
,且不允許被賦值為NULL
。