全部產品
Search
文件中心

PolarDB:PolarDB PostgreSQL(相容Oracle)2.0版本與1.0版本差異說明

更新時間:Jul 15, 2025

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索引,在構建過程中預先排序資料,從而可以大幅提高GiST和SP-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_integernumberrowrowid等Oracle標準類型,並提供nls_date_formatnls_timestamp_format來控制時間類型的輸出格式。

  • 在數值計算方面,INT2INT4INT8類型的除法結果都為浮點數,提升了數值計算與Oracle行為的相容性。

增強JSON和XML類型支援

  • 支援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形式的函數不帶括弧調用,空串視為NULL等Oracle特有特性。

  • 支援時間函數包括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執行DML和DDL語句、執行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_PRIVS等Oracle常用的視圖。

  • 支援DBA_COL_COMMENTS視圖,用於查看和管理列注釋資訊。

  • 支援nls參數視圖,擴充國際化參數的支援,增強多語言組態管理。

  • 支援全參數的DBA_TAB_COLUMNS視圖,提供更全面的表列資訊。

  • 支援SESSION_ROLE內建視圖,擴充會話角色管理的功能。

  • 支援USER_TAB_PARTITIONS視圖HIGH_VALUE欄位,最佳化分區表高值管理。

  • 支援DBA_OBJECTS視圖CREATED欄位,用於查看對象的建立時間。

其他進階功能特性

DBLink異構串連

支援DBLink功能,可實現與PostgreSQL資料庫和Oracle資料庫的串連。此功能為您提供了跨資料庫訪問的能力,便於Data Integration和遷移情境的實施。

字元編碼支援

支援服務端使用GBK和GB18030編碼,以降低在用戶端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類型用作關聯陣列的索引類型。

  • 不支援在全域範圍內對集合型別宣告非空屬性。