PolarDB PostgreSQL 14版相對(duì)于PolarDB PostgreSQL 11版的變化點(diǎn)
本文介紹了PolarDB PostgreSQL 11版升級(jí)至PolarDB PostgreSQL 14版后的變化點(diǎn)。
概述
PolarDB PostgreSQL版作為一款企業(yè)級(jí)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),具有廣泛的應(yīng)用和強(qiáng)大的社區(qū)支持。每個(gè)新版本的發(fā)布都帶來(lái)了許多改進(jìn)和新特性,以提高性能、可用性和安全性。目前,升級(jí)到PolarDB PostgreSQL14版本可以顯著提升數(shù)據(jù)庫(kù)性能與使用體驗(yàn)。
PolarDB PostgreSQL 14版本(簡(jiǎn)稱PG 14版本)引入了新的查詢優(yōu)化算法和存儲(chǔ)引擎,提高了查詢速度和并發(fā)處理能力,能夠更快地處理大量數(shù)據(jù),提升數(shù)據(jù)庫(kù)的響應(yīng)能力和性能。此外,該版本還引入了許多新的功能和增強(qiáng)功能,提供更好的用戶體驗(yàn)和開(kāi)發(fā)者工具。例如,改進(jìn)了對(duì)JSON數(shù)據(jù)類型的支持,使處理和查詢JSON數(shù)據(jù)更加便捷;豐富的監(jiān)控和診斷工具,幫助您更好地理解和優(yōu)化數(shù)據(jù)庫(kù)的性能;加強(qiáng)了數(shù)據(jù)庫(kù)的安全性和可靠性,引入了更嚴(yán)格的訪問(wèn)控制策略和權(quán)限管理功能,保護(hù)您的數(shù)據(jù)免受潛在的安全威脅;改進(jìn)了備份和恢復(fù)功能,使您能夠更輕松地保護(hù)和恢復(fù)數(shù)據(jù)。
升級(jí)到PolarDB PostgreSQL 14版本還意味著您可以與PostgreSQL社區(qū)保持同步,提供更多的資源和支持,幫助您解決問(wèn)題并學(xué)習(xí)數(shù)據(jù)庫(kù)的最佳實(shí)踐。建議您升級(jí)到PolarDB PostgreSQL 14版本。
在PolarDB PostgreSQL 11版本(簡(jiǎn)稱PG 11版本)升級(jí)到PolarDB PostgreSQL 14版本的過(guò)程中,大部分的數(shù)據(jù)類型、內(nèi)置函數(shù)、表列和對(duì)象都沒(méi)有發(fā)生顯著變化,大多數(shù)變化屬于細(xì)節(jié)改進(jìn)。通過(guò)邏輯復(fù)制等方式(推薦使用DTS工具)可以實(shí)現(xiàn)接近100%的兼容性,而具體的變化細(xì)節(jié)如下所示。
系統(tǒng)表和內(nèi)置列
移除oid列的特殊行為。PG 11版本,在表創(chuàng)建過(guò)程中可以使用
WITH OIDS
來(lái)指定一個(gè)通常不可見(jiàn)的oid列,PG 14版本已經(jīng)移除了該能力。但仍然可以顯式聲明列的數(shù)據(jù)類型為oid。對(duì)于使用WITH OIDS
創(chuàng)建的列的操作需要進(jìn)行調(diào)整。PG 11版本中,系統(tǒng)目錄中隱藏的oid列現(xiàn)在變成普通的oid列。因此,SELECT *
現(xiàn)在會(huì)輸出這些列,而PG 11版本只有在顯式選擇時(shí)才會(huì)顯示這些列。將類型為name的表列默認(rèn)標(biāo)記為
C
排序規(guī)則。數(shù)據(jù)類型為name的比較運(yùn)算符現(xiàn)在可以使用任何排序規(guī)則,而不僅僅使用C
排序規(guī)則。為了保持查詢的先前語(yǔ)義,現(xiàn)在明確將類型為name的表列標(biāo)記為具有C
排序規(guī)則。這個(gè)副作用是,name列上的正則表達(dá)式運(yùn)算符現(xiàn)在默認(rèn)使用C
排序規(guī)則,而不是數(shù)據(jù)庫(kù)的排序規(guī)則,以確定與區(qū)域相關(guān)的正則表達(dá)式模式(例如\w
)的行為。如果想在name列上的正則表達(dá)式中使用非C
行為,請(qǐng)附加一個(gè)明確的COLLATE
子句。(對(duì)于用戶定義的name列,另一種可能性是在創(chuàng)建表時(shí)指定不同的排序規(guī)則,但這只是將不向后兼容性移動(dòng)到比較運(yùn)算符。)將
information_schema
視圖中的對(duì)象名稱列視為name
類型而不是varchar
類型。根據(jù)SQL標(biāo)準(zhǔn),information_schema
視圖中的對(duì)象名稱列被聲明為domain
類型sql_identifier
。在PostgreSQL中,底層目錄列的類型實(shí)際上是name
類型。這個(gè)更改使sql_identifier
成為name
的domain
,而不是之前的varchar
。這消除了比較和排序行為中的語(yǔ)義不匹配,可以極大地改善對(duì)限制對(duì)象名稱列的information_schema
視圖的查詢的性能。說(shuō)明不等式限制:例如,
SELECT ... FROM information_schema.tables WHERE table_name < 'foo';
現(xiàn)在默認(rèn)使用C
區(qū)域的比較語(yǔ)義,而不是之前的數(shù)據(jù)庫(kù)默認(rèn)排序規(guī)則。對(duì)這些列進(jìn)行排序也將遵循C
排序規(guī)則,可以通過(guò)添加COLLATE "default"
子句來(lái)強(qiáng)制使用之前的行為(和低效性)。刪除過(guò)時(shí)的
pg_constraint.consrc
列。該列已經(jīng)被廢棄很長(zhǎng)時(shí)間,因?yàn)樗鼪](méi)有根據(jù)其他目錄更改(例如,列重命名)進(jìn)行更新。從pg_constraint獲取檢查約束表達(dá)式的文本版本的推薦方法是pg_get_expr(conbin, conrelid)
。pg_get_constraintdef()
也是一個(gè)有用的替代方法。刪除過(guò)時(shí)的
pg_attrdef.adsrc
列。該列已經(jīng)被廢棄很長(zhǎng)時(shí)間了,因?yàn)樗鼪](méi)有根據(jù)其他目錄更改(例如,列重命名)進(jìn)行更新。從pg_attrdef獲取默認(rèn)值表達(dá)式的文本版本的推薦方法是pg_get_expr(adbin, adrelid)
。
操作符和正則表達(dá)式
刪除階乘運(yùn)算符
!
、!!
以及函數(shù)numeric_fac( )
,但仍然支持階乘函數(shù)。刪除對(duì)后綴(右一元)操作符的支持。如果正在轉(zhuǎn)儲(chǔ)后綴操作符,則
pg_dump
和pg_upgrade
將發(fā)出告警。防止
intarray
的包容運(yùn)算符(<@
和@>
)使用GiST索引。之前需要進(jìn)行完整的GiST索引掃描,所以避免進(jìn)行完整的GiST索引掃描并掃描堆,這樣操作速度更快,應(yīng)刪除為此目的創(chuàng)建的索引。重構(gòu)幾何函數(shù)和運(yùn)算符的代碼。可能會(huì)導(dǎo)致與PG 11版本相比更準(zhǔn)確但稍有不同的結(jié)果。
說(shuō)明與NaN、下溢、溢出和除零有關(guān)的情況的處理比以前更加一致。
允許
\D
和\W
通配符在正則表達(dá)式對(duì)換行符敏感模式中匹配換行符。在此模式下,之前它們不匹配換行符,但這與其他常見(jiàn)的正則表達(dá)式引擎的行為不一致,可以使用[^[:digit:]]
或[^[:word:]]
來(lái)獲得舊行為。忽略正則表達(dá)式反向引用時(shí)的限制。例如,在
(^\d+).*\1
中,^
約束應(yīng)在字符串的開(kāi)頭應(yīng)用,但在匹配\1
時(shí)不應(yīng)用。在正則表達(dá)式字符類中禁止將
\w
用作范圍的起始或結(jié)束。
函數(shù)與表達(dá)式
不允許在負(fù)數(shù)的情況下使用
factorial
函數(shù)。PG 11版本中,該情況返回1。通過(guò)使用新算法改進(jìn)了
real
和double precision
值的輸出性能。PG 11版本中,顯示的浮點(diǎn)數(shù)值默認(rèn)情況下會(huì)四舍五入到6位(對(duì)于real
)或15位(對(duì)于double precision
),根據(jù)extra_float_digits
的值進(jìn)行調(diào)整。在PG 14版本,只有在extra_float_digits
大于零時(shí)(默認(rèn)情況),才會(huì)僅輸出保留精確二進(jìn)制值所需的最少位數(shù)。當(dāng)extra_float_digits
設(shè)置為零或更小時(shí),行為與PG 11版本相同。此外,浮點(diǎn)數(shù)指數(shù)的格式現(xiàn)在在各個(gè)平臺(tái)上是統(tǒng)一的:除非需要三位數(shù),否則使用兩位數(shù)。當(dāng)輸入為單個(gè)NaN值時(shí),將
var_samp()
和stddev_samp()
的numeric
參數(shù)返回NULL,PG 11版本中返回NaN。random()
和setseed()
在各個(gè)平臺(tái)上的行為在PG 11版本中是統(tǒng)一的。在使用特定種子值進(jìn)行setseed()
調(diào)用后生成的random()
值序列可能與PG 11版本中的不同。但是,它也是可重復(fù)的,在PG 11版本中無(wú)法保證,因?yàn)榉?wù)器內(nèi)部的其他隨機(jī)數(shù)使用可能會(huì)干擾。SQL的random()
函數(shù)現(xiàn)在具有自己的私有會(huì)話狀態(tài),以防止這種情況發(fā)生。將
EXTRACT()
的返回類型從float8更改為numeric。這樣可以避免某些用法中的精度丟失問(wèn)題。舊行為仍然可以通過(guò)使用舊的底層函數(shù)date_part()
來(lái)獲得。此外,在PG 14版本中,EXTRACT(date)
對(duì)于不是date數(shù)據(jù)類型的單位會(huì)拋出錯(cuò)誤。將SQL風(fēng)格的
substring()
改為具有標(biāo)準(zhǔn)兼容的貪婪行為。在模式可以有多種匹配方式的情況下,在PG 14版本中,初始子模式被視為匹配最少可能的文本,而不是最多的。例如,模式%#"aa*#"
會(huì)選擇輸入中的第一個(gè)a組,而不是最后一個(gè)。引用某些內(nèi)置數(shù)組函數(shù)及其參數(shù)類型的用戶定義對(duì)象必須重新創(chuàng)建。具體來(lái)說(shuō),
array_append()
、array_prepend()
、array_cat()
、array_position()
、array_positions()
、array_remove()
、array_replace()
和width_bucket()
在PG 11版本中接受anyarray
參數(shù),但在PG 14版本中接受anycompatiblearray
。因此,在升級(jí)之前必須刪除引用這些數(shù)組函數(shù)簽名的聚合和操作符等用戶定義對(duì)象,并在升級(jí)完成后重新創(chuàng)建。在使用屬性編號(hào)時(shí),對(duì)于不存在或已刪除的列進(jìn)行
has_column_privilege()
檢查時(shí)返回false。在PG 11版本中,此類屬性編號(hào)會(huì)返回?zé)o效列錯(cuò)誤。修復(fù)
to_tsquery()
和websearch_to_tsquery()
以正確解析包含已丟棄令牌的查詢文本。某些已丟棄的令牌(如下劃線)導(dǎo)致這些函數(shù)的輸出產(chǎn)生不正確的tsquery
輸出。例如,websearch_to_tsquery('"pg_class pg"')
和to_tsquery('pg_class <-> pg')
在PG 11版本中輸出( 'pg' & 'class' ) <-> 'pg'
,但在PG 14版本中兩者都輸出'pg' <-> 'class' <-> 'pg'
。修復(fù)
websearch_to_tsquery()
以正確解析帶有多個(gè)相鄰已丟棄令牌的引號(hào)內(nèi)文本。在PG 11版本中,包含多個(gè)相鄰已丟棄令牌的引號(hào)內(nèi)文本被視為多個(gè)令牌,導(dǎo)致輸出不正確的tsquery
。例如,websearch_to_tsquery('"aaa: bbb"')
在PG 11版本輸出'aaa' <2> 'bbb'
,但在PG 14版本輸出'aaa' <-> 'bbb'
。修復(fù)無(wú)限窗口函數(shù)范圍的處理。在PG 11版本中,像
'inf' PRECEDING AND 'inf' FOLLOWING
這樣的窗口幀子句會(huì)返回不正確的結(jié)果。防止
tablefunc
的函數(shù)normal_rand()
接受負(fù)值。負(fù)值會(huì)產(chǎn)生不良結(jié)果。將
SIMILAR TO ... ESCAPE NULL
更改為返回NULL。這種新行為符合SQL規(guī)范。在PG 11版本中,空的ESCAPE值被認(rèn)為是使用默認(rèn)的轉(zhuǎn)義字符串(反斜杠字符)。對(duì)于substring(text FROM pattern ESCAPE text)
也適用相同規(guī)則。通過(guò)保持原始函數(shù)不變,在PG 11版本中的行為在舊視圖中得到保留。使
json[b]_to_tsvector()
完全檢查其string
選項(xiàng)的拼寫(xiě)。刪除
pretty-print
作用xpath()
或XMLTABLE
構(gòu)造的結(jié)果。在某些情況下,這些函數(shù)會(huì)在節(jié)點(diǎn)集值中插入額外的空白(換行符和/或空格)。因?yàn)楦鶕?jù)使用情況,空白可能被認(rèn)為是重要的語(yǔ)義。
查詢優(yōu)化
更改非默認(rèn)的
effective_io_concurrency
值對(duì)并發(fā)性的影響方式。在PG 11版本中,在設(shè)置并發(fā)請(qǐng)求數(shù)量之前會(huì)對(duì)該值進(jìn)行調(diào)整,而在PG 14版本中可以直接使用該值。可以使用以下方法將舊值轉(zhuǎn)換為新值:SELECT round(sum(OLDVALUE / n::float)) AS newvalue FROM generate_series(1, OLDVALUE) s(n);
。在
ltree
中,當(dāng)lquery
模式包含帶括號(hào)的相鄰星號(hào),例如*{2}.{3}
,正確解釋為{5}
。在新的btree索引中,最大索引條目的長(zhǎng)度減少了八個(gè)字節(jié),以改善對(duì)重復(fù)條目的處理。這意味著對(duì)從PG 11版本進(jìn)行
pg_upgrade
的索引進(jìn)行REINDEX
操作可能會(huì)出現(xiàn)故障。
DDL數(shù)據(jù)操作
修復(fù)
ALTER FOREIGN TABLE ... RENAME COLUMN
以返回更合適的命令標(biāo)記。在PG 11版本中返回ALTER TABLE
,在PG 14版本中返回ALTER FOREIGN TABLE
。修復(fù)
ALTER MATERIALIZED VIEW ... RENAME COLUMN
以返回更合適的命令標(biāo)記。在PG 11版本中返回ALTER TABLE
,在PG 14版本中返回ALTER MATERIALIZED VIEW
。禁止在
CREATE
/DROP LANGUAGE
命令中對(duì)語(yǔ)言名稱使用單引號(hào)。如果沒(méi)有提供參數(shù)列表并且存在多個(gè)匹配的對(duì)象,則使用
DROP IF EXISTS FUNCTION/PROCEDURE/AGGREGATE/ROUTINE
時(shí)會(huì)產(chǎn)生錯(cuò)誤,還改進(jìn)了這種情況下的錯(cuò)誤消息。
插件和工具
不允許在psql的
\pset format
命令中使用非唯一的縮寫(xiě)。在PG 11版本中,例如,\pset format a
選擇的是aligned
;在PG 14版本中則會(huì)失敗,因?yàn)檫@樣寫(xiě)同樣可以表示asciidoc
。移除
timetravel
擴(kuò)展,移除數(shù)據(jù)類型abstime
、reltime
和tinterval
,這些類型已被SQL標(biāo)準(zhǔn)類型(例如timestamp
)所取代。防止在
pg_stat_ssl
和pg_stat_gssapi
系統(tǒng)視圖中顯示輔助進(jìn)程。如果查詢將這些視圖與pg_stat_activity
連接,并希望看到輔助進(jìn)程,將需要使用左連接。