PostgreSQL 全球開發組宣佈,PostgreSQL 17 的第一個 beta 版本現已 可供下載。此版本包含了 PostgreSQL 17 正式釋出時將提供的所有功能的預覽,但釋出的一些細節在 beta 期間可能會發生變化。
您可以在 釋出說明 中找到有關 PostgreSQL 17 所有功能和更改的資訊。
https://postgres.tw/docs/17/release-17.html
本著開源 PostgreSQL 社群的精神,我們強烈鼓勵您在您的系統上測試 PostgreSQL 17 的新功能,以幫助我們消除可能存在的 bug 或其他問題。雖然我們不建議您在生產環境中使用 PostgreSQL 17 Beta 1,但我們鼓勵您嘗試使用此 beta 版本執行您典型的應用程式工作負載。
您的測試和反饋將幫助社群確保 PostgreSQL 17 版本能夠保持我們提供世界上最先進的開源關係資料庫的穩定、可靠版本的標準。請閱讀更多關於我們的 Beta 測試流程 以及您如何貢獻。
https://postgres.tw/developer/beta/
PostgreSQL 17 在近期版本的基礎上繼續改進整個系統的效能。Vacuum(PostgreSQL 中負責回收儲存空間的程序)擁有了一個新的內部資料結構,這使得記憶體使用量最多可減少 20 倍,並且整體完成工作的時間也有所縮短。此外,vacuum 程序不再有 1GB 的記憶體使用限制(由 maintenance_work_mem 控制),讓您可以選擇為 vacuum 分配更多資源。
此版本引入了一個流式 I/O 介面,在執行順序掃描和執行 ANALYZE 時可以顯示效能提升。PostgreSQL 17 還包含可控制 事務、子事務和多事務緩衝區 可擴充套件性的配置引數。
PostgreSQL 17 現在可以同時利用規劃器統計資訊和 公用表表達式(WITH 查詢)的排序順序來進一步最佳化這些查詢,幫助它們更快地執行。此外,此版本顯著縮短了使用帶有 B-tree 索引 的 IN 子句的查詢的執行時間。從這個版本開始,PostgreSQL 可以從執行中移除對具有 NOT NULL 約束的列的冗餘 IS NOT NULL 語句,並且不再需要處理包含在 IS NOT NULL 列上的 IS NULL 子句的查詢。現在,PostgreSQL 17 支援對 BRIN 索引使用並行索引構建。
高度併發更改的工作負載可以受益於 PostgreSQL 17,因為 預寫日誌(WAL)鎖的管理方式得到了改進,部分測試顯示效能提升高達 2 倍。
最後,PostgreSQL 17 增加了更多的顯式 SIMD 指令,包括對 bit_count 函式的 AVX-512 支援。
PostgreSQL 17 為分割槽管理帶來了更大的靈活性,增加了拆分和合並分割槽的能力,並增加了對分割槽表標識列和排除約束的支援。此外,PostgreSQL 外部資料包裝器(postgres_fdw)可以從帶有 EXISTS 和 IN 子查詢的查詢中獲得性能提升,因為這些現在可以被下推到遠端伺服器。
PostgreSQL 17 為邏輯複製增加了新功能,使其在高可用性工作負載和升級中更易於使用。從 PostgreSQL 17 升級到新版本時,在使用 pg_upgrade 時不再需要刪除 邏輯複製槽,從而避免在升級後重新同步資料。此外,此版本引入了邏輯複製的故障轉移控制,為在高可用性環境中管理 PostgreSQL 資料庫提供了更多控制。PostgreSQL 17 還允許邏輯複製訂閱者使用 hash 索引進行查詢,並引入了 pg_createsubscriber 命令列工具,用於透過物理複製在副本上新增邏輯複製。
PostgreSQL 17 繼續構建在 SQL/JSON 標準之上,增加了對 JSON_TABLE 功能的支援,該功能可以將 JSON 轉換為標準的 PostgreSQL 表,以及 SQL/JSON 建構函式(JSON、JSON_SCALAR、JSON_SERIALIZE)和查詢函式(JSON_EXISTS、JSON_QUERY、JSON_VALUE)。值得注意的是,這些功能最初是為 PostgreSQL 15 版本計劃的,但在 beta 期間由於設計考慮而被回滾,這也是我們要求您在 beta 期間幫助測試功能的原因之一!此外,PostgreSQL 17 為其 jsonpath 實現增加了更多功能,並支援將 JSON 值轉換為不同資料型別。
MERGE 命令現在支援 RETURNING 子句,讓您可以進一步處理已修改的行。您還可以使用新的 merge_action 函式來檢視 MERGE 命令的哪個部分修改了行。PostgreSQL 17 還允許您使用 MERGE 命令更新檢視,並添加了 WHEN NOT MATCHED BY SOURCE 子句,以便在源行不滿足條件時提供行為。
COPY 用於從 PostgreSQL 高效地批次載入和匯出資料,現在使用 PostgreSQL 17,在匯出大型行時,您可能會看到高達 2 倍的效能提升。此外,當源編碼與目標編碼匹配時,COPY 的效能有所提升,並且有一個新的選項 ON_ERROR,允許在插入行出錯時繼續複製。PostgreSQL 17 還為 非同步和更安全的查詢取消例程 提供了更好的支援,驅動程式可以使用 libpq API 來採用這些例程。
PostgreSQL 17 包含一個內建的排序提供程式,該提供程式提供與 C 排序相似的排序語義,但使用 UTF-8 編碼而不是 SQL_ASCII。這個新的排序保證是不可變的,確保您的排序返回值不會因 PostgreSQL 安裝所在的系統而改變。
PostgreSQL 17 添加了一個新的連線引數 sslnegotiation,它允許 PostgreSQL 在使用 ALPN 時執行直接 TLS 握手,從而消除了網路往返。PostgreSQL 在 ALPN 目錄中註冊為 postgresql。
此版本引入了在認證期間執行的事件觸發器,並且在 libpq 中包含了一個名為 PQchangePassword 的新 API,該 API 可在客戶端自動對密碼進行雜湊處理,以防止伺服器中意外記錄明文密碼。
PostgreSQL 17 添加了一個新的 預定義角色 pg_maintain,該角色授予使用者對所有關係執行 VACUUM、ANALYZE、CLUSTER、REFRESH MATERIALIZED VIEW、REINDEX 和 LOCK TABLE 的許可權。此版本還確保 search_path 對於 VACUUM、ANALYZE、CLUSTER、REFRESH MATERIALIZED VIEW 和 INDEX 等維護操作是安全的。最後,使用者現在可以使用 ALTER SYSTEM 來設定未識別的自定義伺服器變數的值。
PostgreSQL 17 引入了使用 pg_basebackup 執行增量備份的能力,並添加了一個名為 pg_combinebackup 的新實用程式,該實用程式在備份恢復過程中使用。此版本為 pg_dump 添加了一個名為 --filter 的新標誌,允許您指定一個包含要包含/排除在 dump 中的物件的指令的檔案。
EXPLAIN 命令(提供有關查詢計劃和執行的資訊)增加了兩個新選項:SERIALIZE,顯示將資料轉換為網路傳輸所需的時間;MEMORY,報告最佳化器記憶體使用情況。此外,EXPLAIN 現在還可以顯示花費在 I/O 塊讀寫上的時間。
PostgreSQL 17 標準化了 CALL 在 pg_stat_statements 中的引數,減少了頻繁呼叫的儲存過程的條目數。此外,VACUUM 進度報告 現在顯示索引 vacuuming 的進度。PostgreSQL 17 還引入了一個新檢視 pg_wait_events,它提供了關於等待事件的描述,並且可以與 pg_stat_activity 結合使用,以更深入地瞭解活動會話為何在等待。此外,pg_stat_bgwriter 檢視中的一些資訊現在被拆分到新的 pg_stat_checkpointer 檢視中。
PostgreSQL 17 中還添加了許多其他新功能和改進。其中許多可能對您的用例也有幫助。請參閱 釋出說明 以獲取新功能和更改功能的完整列表。
https://postgres.tw/docs/17/release-17.html
每個 PostgreSQL 版本的穩定性在很大程度上取決於您——社群——在 PostgreSQL 17 通用可用性之前,使用您的工作負載和測試工具測試即將釋出版本,以發現 Bug 和迴歸。由於這是 Beta 版,資料庫行為、功能細節和 API 仍有可能進行少量更改。您的反饋和測試將有助於確定新功能的最終調整,因此請在不久的將來進行測試。使用者測試的質量將決定我們何時可以釋出最終版本。
PostgreSQL Wiki 上公開提供了一個 未解決問題 列表。您可以使用 PostgreSQL 網站上的此表單 報告 Bug。
https://postgres.tw/account/submitbug/
這是 17 版本的第一個 beta 版本。PostgreSQL 專案將在測試需要時釋出額外的 beta 版本,然後釋出一個或多個候選版本,直到最終版本在 2024 年 9 月/10 月左右釋出。更多資訊請參閱 Beta 測試 頁面。