博客 / 詳情

返回

PostgreSQL 18 已發佈:一文讀懂核心變化

PostgreSQL 18的發佈,標誌着這個開源數據庫再次向前邁出了一大步。這次更新沒有太多花哨的概念,而是專注於解決實際問題,讓數據庫跑得更快、用起來更順手、維護起來更省心。

image.png

性能大躍進:從I/O到查詢優化

異步I/O (Asynchronous I/O )系統

這是PostgreSQL 18底層最重大的性能改進。過去,PostgreSQL在讀取數據時很大程度上依賴操作系統的預讀(readahead)機制,但操作系統並不瞭解數據庫的訪問模式,效果時好時壞。

PG 18引入了全新的異步I/O(AIO)子系統,允許數據庫一次性併發地發起多個I/O請求,而不是一個接一個地等待。這極大地提升了數據讀取的吞吐量,特別是在順序掃描、位圖堆掃描和VACUUM等操作上。根據基準測試,在某些存儲密集型場景下,性能提升可高達3倍。

可以通過新的io_method參數來配置使用哪種AIO模式,例如在Linux上推薦的io_uring

更聰明的查詢優化

  • 跳躍掃描(Skip Scans): 對於多列B-tree索引,以前的查詢如果跳過了索引的第一個列,往往無法有效利用索引。現在PG 18支持了跳躍掃描,即使查詢條件不包含索引的前導列,也能高效地使用索引。
    例如,有一個針對訂單的索引 (customer_id, order_date)。現在,即使只想查詢某個特定日期的所有訂單,不指定customer_id,查詢也能跑得很快。
 -- 創建一個常見的訂單表和多列索引
 CREATE TABLE orders (
     order_id    SERIAL PRIMARY KEY,
     customer_id INT,
     order_date  DATE,
     amount      DECIMAL(10, 2)
 );

 CREATE INDEX idx_customer_order_date ON orders (customer_id, order_date);

 -- 在PG 18中,這樣的查詢性能會得到顯著提升
 -- 即使它跳過了索引的第一個列 customer_id
 SELECT * FROM orders WHERE order_date = '2025-11-11';
  • 並行 GIN索引構建: GIN索引對於全文搜索和JSONB數據類型非常重要,但構建過程很慢。PG 18現在支持並行構建GIN索引,大幅縮短了大數據量下的索引創建時間。

開發者體驗全面提升

時間排序的UUIDv7

UUID是許多應用的主鍵選擇,但傳統的UUIDv4是完全隨機的,會導致B-tree索引碎片化嚴重,影響插入和查詢性能。PG 18原生支持了uuidv7()函數。

UUIDv7結合了時間戳和隨機數,生成的ID是按時間順序排列的。這對於索引的局部性原理非常友好,可以顯著提升寫入性能並減少索引膨脹。

CREATE TABLE event_logs (
    id   UUID PRIMARY KEY DEFAULT uuidv7(),
    log_data JSONB
);

-- 插入的數據會按時間順序物理存儲,性能更佳
INSERT INTO event_logs (log_data) VALUES ('{"event": "user_login"}');

虛擬生成列成為默認

生成列(Generated Columns)很有用,PG 18將其默認實現改為了虛擬(virtual)方式。這意味着生成列的值不會被物理存儲,而是在查詢時動態計算。這節省了存儲空間,並且在源列更新時沒有任何寫入開銷。

RETURNING子句的增強

INSERTUPDATEDELETE等操作中,RETURNING子句現在可以同時訪問OLD(舊值)和NEW(新值)的記錄。這對於實現審計日誌或需要比較新舊數據變化的場景非常方便。

CREATE TABLE project_tasks (
    id SERIAL PRIMARY KEY,
    task_name TEXT,
    current_status TEXT
);

INSERT INTO project_tasks (task_name, current_status) VALUES ('Design Mockups', 'in-progress');

-- 更新任務狀態,並同時返回舊狀態和新狀態
UPDATE project_tasks
SET current_status = 'review'
WHERE id = 1
RETURNING task_name, OLD.current_status AS previous_status, NEW.current_status AS updated_status;

升級與維護,不再痛苦

更快、更平滑的主版本升級

這是DBA和運維人員的福音。過去pg_upgrade升級主版本後,查詢優化器需要重新收集統計信息,導致升級後的一段時間內查詢性能不佳,即所謂的冷啓動問題。

PG 18解決了這個痛點,pg_upgrade現在可以在升級過程中保留查詢計劃器的統計信息,讓數據庫升級後能立刻達到預期的性能水平。

此外,pg_upgrade本身也變快了,尤其是在處理包含大量表和序列的數據庫時。新增的--jobs參數可以並行執行檢查,而--swap參數則通過交換目錄的方式來代替文件複製,進一步縮短停機時間。

更深入的可觀測性

EXPLAIN ANALYZE的輸出信息更加豐富了。現在它會默認顯示查詢過程中訪問了多少個緩衝區(buffers),讓你能直觀地看到查詢的I/O開銷。如果使用VERBOSE選項,還能看到CPU時間、WAL使用量和平均讀取統計等詳細信息,這為深度性能調優提供了第一手數據。

其他值得關注的變化

  • OAuth 2.0身份驗證: 新增oauth認證方法,讓PostgreSQL可以更輕鬆地與單點登錄(SSO)系統集成。
  • 默認開啓頁面 校驗和 新創建的數據庫(通過initdb)會默認啓用數據頁校驗和,這有助於在硬件發生問題時及早發現數據損壞。
  • MD5 密碼認證被棄用: 出於安全考慮,MD5認證方式已被標記為棄用,並將在未來版本中移除。現在推薦使用更安全的SCRAM認證。

如何快速上手PostgreSQL 18?

這麼多強大的新功能,是不是也想體驗一下。但在正式版發佈初期,自己編譯安裝或者尋找合適的軟件包可能會比較繁瑣。

那就要推薦像 ServBay 這樣的集成開發環境了。ServBay 提供了一個包含了多種常用軟件的本地開發套件,它的一大優勢就是能讓開發者快速用上最新的技術。ServBay已計劃在第一時間提供PostgreSQL 18的一鍵安裝支持,像下載軟件一樣,點擊PostgreSQL下載,就能擁有一個功能完備的PostgreSQL 18實例,立即開始測試這些新特性。

image.png

總結

PostgreSQL 18是一次非常紮實的更新,它沒有追求華而不實的功能,而是聚焦於性能、可用性和安全性這些核心領域。異步I/O、平滑的升級體驗和UUIDv7等特性,將直接為開發者和運維團隊帶來巨大的價值。

對於想要第一時間體驗這些強大功能的開發者來説,選擇一個好的本地開發環境非常關鍵。ServBay 率先支持PostgreSQL 18,通過它的一鍵安裝功能,可以輕鬆搭建最新版本的開發環境,為項目遷移和升級做好充分準備。

user avatar u_17468181 頭像 u_11841527 頭像 kinfuy 頭像 u_56701 頭像 u_17397181 頭像 uwatechnologies 頭像 yumenokanata 頭像
7 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.