动态

详情 返回 返回

DBA 視角:Postgres 18 新版本,帶來了哪些變化? - 动态 详情

原文地址:https://www.bytebase.com/blog/what-is-new-in-postgres-18

PostgreSQL 於 2025 年 5 月 8 日宣佈了 18 beta 1 版本的發佈。雖然一些功能可能還會被移除,但值得一看。

異步 I/O

PostgreSQL 18 在底層引入了一個重大改進,即新的異步 I/O(AIO)子系統。根據官方的版本説明,此功能旨在提高 I/O 吞吐量並隱藏 I/O 延遲,可以通過 io_method 服務器變量啓用。對於 Linux 用户,這意味着可以利用 io_uring,而且可在任意平台基於工作線程實現。原實現方式主要針對文件系統讀取,包括順序掃描、位圖堆掃描和清理操作;新的系統視圖 pg_aios 也將可顯示用於 AIO 的文件句柄。

終於有 AIO 了!承諾某些讀取操作 2-3 倍的性能改進,聽起來很棒(對使用網絡附加磁盤的雲數據庫來説,真的有可能)。

不過別忘了,這只是針對讀取的;不要指望你的寫入密集型 OLTP 會一夜間神奇地加速。當然,AIO 仍是一個巨大的進步,如果沒有引入新 I/O 錯誤的話。
DBA Note

UUIDv7

PostgreSQL 18 為處理分佈式系統或需要全局唯一、可排序標識符的開發者帶來了對 UUIDv7 的原生支持。正如 PostgreSQL 18 Beta 1 發佈公告中所強調的,新的 uuidv7() 函數允許生成按時間戳排序的 UUID。相比傳統的 UUID(如 UUIDv4,uuidv4() 現在是 gen_rand_uuid() 的別名),這在數據庫性能方面是一個重大改進,尤其是對於索引和緩存策略,因為按時間排序的特性可以帶來更好的數據局部性並減少 B 樹索引中的頁面分裂。

現在,我們的主鍵就既可以全局唯一,又可以與索引很好地配合。遲到總比不到好。

DBA Note

改進的 EXPLAIN

EXPLAIN 命令在理解查詢性能方面是 DBA 最好的朋友(有時也是最大的敵人)。PostgreSQL 18 為 EXPLAIN 的輸出帶來了幾個正向的改進,使其更有洞察力。根據版本説明,EXPLAIN ANALYZE 現在將自動包含 BUFFERS 輸出,省去了額外的關鍵字。此外,改進後的 EXPLAIN ANALYZE VERBOSE 將顯示 WAL(預寫日誌)使用情況、CPU 統計信息和平均讀取統計信息。EXPLAIN (WAL)VACUUM/ANALYZE (VERBOSE) 和自動清理日誌輸出中還添加了完整的 WAL 緩衝區計數。

也許,僅僅是也許,現在更多的開發者會真正查看緩衝區使用情況。VERBOSE 中的 WAL、CPU 和平均讀取統計數據很有助於真正深入的分析;還有一個指標可以將自動清理跟不上的原因解釋得一清二楚。

DBA Note

NOT NULL 約束作為 NOT VALID

PostgreSQL 18 引入了另一個對 schema 管理的有益改進,即能夠將 NOT NULL 約束添加為 NOT VALID

此功能允許用户添加 NOT NULL 約束而無需立即掃描整個表,之後驗證時也無需持有 ACCESS EXCLUSIVE 鎖。這對於大表特別有價值,可以大量節省添加約束所需的停機時間。

這個新語法需要使用命名約束方法:

ALTER TABLE table_name ADD CONSTRAINT constraint_name NOT NULL (column) NOT VALID;

之後,可以使用以下方式驗證約束:

ALTER TABLE table_name VALIDATE CONSTRAINT constraint_name;

在驗證期間,PostgreSQL 只持有 ShareUpdateExclusiveLock,這意味着 SELECT、INSERT、UPDATE 和 DELETE 等正常操作可以在驗證過程運行時繼續工作。

即使 NOT NULL 約束被添加為 NOT VALID,它仍然阻止新的 NULL 值插入到列中。這為新行提供了即時的數據完整性,並允許在任何時候清理現有的 NULL 值。

這對於我們這些以每秒美元計算停機時間、管理大型生產數據庫的人來説,簡直是雪中送炭。我們不再需要為了給某個 10TB 的表添加 NOT NULL 約束而安排凌晨 3 點的維護窗口。被標記為無效時仍然阻止新的 NULL 值,這是完美的平衡:向前傳遞完整的數據,而不必立即驗證。

DBA Note

RETURNING 中的 OLD/NEW 值

以前的 RETURNING 為 INSERT 和 UPDATE 返回新值,為 DELETE 返回舊值;MERGE 操作根據所執行的內部查詢來返回值。新語法則更加靈活,允許 INSERT ON CONFLICT 和 UPDATE 返回舊值(以前 UPDATE 只有新值),DELETE 在 ON DELETE 行賦值產生新值時可能返回新值。可通過更改關係別名「old」和「new」來指定所需的值。

這很好地簡化了應用程序邏輯。今後要獲取前後對比,就不再需要處理繁複的 SELECT 語句或觸發器了。

DBA Note

虛擬生成列

根據版本説明,PostgreSQL 18 改變了生成列的處理方式,「在讀取時(而非寫入時)計算其值」。有別於傳統的 STORED 生成列,虛擬生成列成為了默認值;儘管STORED 選項仍然可用於需要顯式寫入時計算和存儲的場合。PostgreSQL 18 Beta 1 還宣佈,存儲的生成列現在可以邏輯複製。

鑑於相當多的的全名或簡單計算,對於從其他列派生且無需物理存儲的列,這樣會節省大量磁盤空間和寫入開銷。代價是讀取時計算,意味着查詢這些虛擬列可能受輕微的性能影響,特別是生成邏輯複雜的情況下;因此,存儲的列可進行邏輯複製,是一個不錯的補充。

DBA Note

主要版本升級體驗

許多 DBA 升級 PostgreSQL 主要版本會有顧慮。

變更仍主要採取 pg_dumpall 後恢復、使用 pg_upgrade、邏輯複製等標準操作,但 PostgreSQL 18 將改善此過程的體驗。

新版本説明強調了通過主要版本升級保持規劃器統計信息的能力;新升級的集羣可以更快達到預期的性能狀態,而無需等待跨所有數據的 ANALYZE 運行。pg_upgrade 本身性能也有提升,包括其檢查的並行處理(通過 --jobs 標誌)和新的 --swap 標誌(交換而非複製升級目錄),在大型安裝場景下可以節省大量時間。

當然,任何主要版本都需要注意兼容性問題。版本 18 的説明中列出了幾個:時區縮寫處理的變化、MD5 密碼認證的棄用(終於!)、VACUUMANALYZE 處理繼承的變化、COPY FROM 關於文件結束標記行為的修改等。升級之前徹底審查兼容性是至關重要的。

只要能消滅升級時那個可怕的維護窗口的,都是好東西。當然,不兼容性列表這個陷阱仍然存在,DBA 仍需要閲讀細則、徹底測試,並保留一個可靠的回滾方案。升級仍然是 DBA 賺危險津貼的場合。

DBA Note


💡 更多資訊,請關注 Bytebase 公號:Bytebase

user avatar ljc1212 头像 edonsoft 头像 wintersun 头像 databend 头像 hashdata 头像 lyhabc 头像 koogua 头像 zhaoqianglaoshi 头像 feixiangdemojing 头像 240cgxo4 头像 zengjingaiguodelang 头像 free_like_bird 头像
点赞 13 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.