閱讀972 返回首頁    go 阿裏雲 go 技術社區[雲棲]


PostgreSQL 10.0 解讀

背景

本文參考當前的release notes以及git, committe fest編寫,10.0還沒有正式release,部分內容在正式release時可能會修改,同時會新增新的內容。

遷移到10.0的注意事項

遷移時,請注意不兼容的地方。

1. 使用pg_upgrade升級時,hash index 需要重建。(因為10.0為了支持hash index WAL,存儲結構改變了。)

2. $PGDATA/pg_log, pg_xlog, pg_clog目錄分別重命名為log, pg_wal, pg_xact。

3. XLOG相關的係統管理函數重命名,xlog改為wal,例如

pg_switch_xlog() becomes pg_switch_wal(), pg_receivexlog becomes pg_receivewal, and --xlogdir becomes --waldir.

4. COALESCE 和 CASE 表達式支持SRF函數,當函數為SRF時,表達式返回多行。

5. plpython支持多維數組,對應Python 類型nested Python lists。

6. 並行查詢相關GUC參數,新增兩個參數min_parallel_table_scan_size , min_parallel_index_scan_size 代替min_parallel_relation_size。表示使用並行查詢的表、索引的最小SIZE。

7. 不再支持浮點 datetimes/timestamps類型,編譯項--disable-integer-datetimes去除。

8. 不再支持client/server protocol version 1.0 。

9. 不再支持contrib/tsearch2。

10. 不再支持version-0版本的c language function。

11. 注意增加了更安全的密碼存儲和認證策略,建議使用。

重大更新

1 服務端

並行查詢

1. 支持並行 b-tree 索引掃描(允許多個並行工作進程掃描不同的b-tree page。)。

2. 支持並行 bitmap heap 掃描。

3. 支持並行 merge join(9.6隻支持並行hash join)。

4. 支持並行 不相幹子查詢。

5. 支持並行 merge sort,例如包含多個分區表的排序查詢,支持merge sort輸出。

6. 內置函數梳理,可以並行的函數被標記為parallel-safe,否則標記為parallel-restricted。

7. 允許用戶設置集群級的最大並行工作進程數量,通過GUC變量max_parallel_workers進行設置。建議max_parallel_workers < max_worker_processes,從而預留更多的worker process給其他需要工作進程的功能模塊。

索引

1. SP-GiST索引新增對INET,CIDR網絡類型的支持。

2. GIN索引垃圾回收優化,減少頁鎖範圍。

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=218f51584d5a9fcdf702bcc7f54b5b65e255c187

3. brin索引優化,支持自動修正元信息。

《PostgreSQL 10.0 preview 功能增強 - BRIN 索引更新smooth化》

4. 使用BRIN索引是否能提升效率?決策將更加精準。

5. 通過有效的空間重用,GiST索引的插入和更新效率更高。

6. HASH索引支持WAL日誌,意味著hash索引是crash safe並且也是支持流複製的了。

7. 優化hash索引bucket的分裂性能,降低鎖需求。

8. hash索引的空間增長將更加有效。

9. 允許清理單個HASH頁的垃圾。

新增兩個參數,max_pred_locks_per_relation 和 max_pred_locks_per_page 。 用於控製串行隔離級別的鎖提升,降低內存開銷。

《PostgreSQL 10.0 preview 功能增強 - 串行隔離級別 預加鎖閾值可控》

優化器

1. 允許用戶自定義統計信息,例如多個列的組合統計信息等。

《PostgreSQL 10.0 preview 功能增強 - 自由定義統計信息維度》

2. 加入JIT框架,OLAP類查詢性能提升明顯。

《PostgreSQL 10.0 preview 性能增強 - 推出JIT開發框架(朝著HTAP邁進)》

性能

1. 使用優化的numeric類型,提升SUM()聚合性能。

2. 使用radix index提升字符集轉換性能。

《PostgreSQL 10.0 preview 性能提升 - radix tree提升字符編碼轉換性能》

3. 降低函數調用的overhead,當函數被多條記錄調用(特別是OLAP場景)時,性能提升非常明顯。

4. 提升grouping set(多維分析)性能。

5. 當外表是UNIQUE時,通過減少內表的掃描,提升hash join, nestloop join的性能。

《PostgreSQL 10.0 preview 性能增強 - hash,nestloop join優化(聰明的優化器是這樣的)》

6. 降低在會話中跟蹤relation統計信息的開銷,特別是當一個會話曾經訪問了多個對象(表、物化視圖、索引等)時。

監控

1. 新增pg_sequence係統表,可以查看數據庫中所有序列的元信息。方便了很多。

2. EXPLAIN語法增加SUMMARY選項,輸出更詳細的QUERY執行統計信息。

3. 刷新物化視圖時,自動刷新物化視圖的統計信息。

4. 添加4名監控角色: pg_monitor, pg_read_all_settings, pg_read_all_stats, pg_stat_scan_tables。 權限分配更細致了。

5. 新增兩個管理函數,普通用戶可以調用,pg_ls_logdir() , pg_ls_waldir() 輸出數據庫日誌目錄的所有文件,數據庫WAL目錄的所有文件。

6. 新增一個管理函數,pg_current_logfile() 返回當前正在寫的log文件。

7. 啟動時,報告socket監聽端口,以及socket文件在哪裏。

8. pg_stat_activity動態視圖,新增一個等待事件latch wait的狀態(狀態包括remaining wait events, 例如 client reads, client writes, and synchronous replication)。

9. pg_stat_activity動態視圖,新增reads, writes, fsyncs的等待狀態。

10. pg_stat_activity動態視圖,新增數據庫管理進程、輔助進程、流複製進程的統計信息。通過backend_type字段區分。

11. pg_stat_activity動態視圖,對於並行工作進程,QUERY列顯示SQL信息。

https://www.postgresql.org/docs/devel/static/monitoring-stats.html

認證

1. 新增SCRAM-SHA-256密碼認證協商機製與密碼存儲機製。提升安全性。用戶在創建用戶時選擇密碼存儲方法,在pg_hba.conf中配置認證協商方法。

《PostgreSQL 10.0 preview 安全增強 - SASL認證方法 之 scram-sha-256 安全認證機製》

2. 新增pg_hba_file_rules視圖,查看pg_hba.conf中的內容,也就是說以後DBA不需要登陸機器,就可以查看目前數據庫防火牆的配置(注意目前顯示的是pg_hba.conf的文件內容,而不是目前激活的配置)。

3. 支持多個RADIUS servers。

服務端配置

1. 允許在線更新SSL配置。通過pg_ctl , SELECT pg_reload_conf(), 或給postmaster進程發送SIGHUP 信號.

2. 降低修改表參數的DCL的鎖粒度,例如修改表的effective_io_concurrency參數,隻需要加載lwlock。

3. 將GUC變量bgwriter_lru_maxpages的最大上限設置為無限大,也就是說bgwriter可以在一個周期內,將所有的髒頁寫出去了。

可靠性

1. 在創建或者刪除文件後,調用fsync。降低斷電帶來的風險。

2. 避免在空閑的係統中執行checkpoint和歸檔

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=6ef2eba3f57f17960b7cd4958e18aa79e357de2f

3. 新增wal_consistency_checking參數,寫入額外的FPW,standby在回放partial WAL時,對比FDW與拚裝的PAGE是否一致。用於調試。

《PostgreSQL 10.0 preview 功能增強 - WAL一致性校驗》

4. WAL 文件最大支持1GB。

2 流複製與恢複

1. 支持邏輯訂閱

《PostgreSQL 10.0 preview 功能增強 - 邏輯訂閱端worker數控製參數》

《PostgreSQL 邏輯訂閱 - 給業務架構帶來了什麼希望?》

《PostgreSQL 10.0 preview 變化 - 邏輯複製pg_hba.conf變化,不再使用replication條目》

《PostgreSQL 10.0 preview 功能增強 - 備庫支持邏輯訂閱,訂閱支持主備漂移了》

《PostgreSQL 10.0 preview 功能增強 - 邏輯複製支持並行COPY初始化數據》

《PostgreSQL 10.0 preview 邏輯複製 - 原理與最佳實踐》

2. 同步複製,支持quorum commit模式的任意副本。

《PostgreSQL 10.0 preview 安全增強 - 任意wal副本數,金融級高可用與可靠性並存需求》

4. 修改默認的wal_level, max_wal_senders, and max_replication_slots參數配置,流複製配置將更簡單。

5. 通過pg_stat_replication新增的三個字段write_lag, flush_lag, and replay_lag,報告備庫的時間度量延遲。

《PostgreSQL 10.0 preview 功能增強 - 流複製統計視圖pg_stat_replication增強, 新增時間維度延遲評估》

6. 基於時間點的恢複(PITR),新增支持LSN作為恢複目標。(目前已支持 xid, 時間, target name, lsn四種目標)

7. 用戶可以選擇pg_stop_backup()是否等待所有歸檔結束。

8. 允許創建臨時replication slot,會話結束後自動刪除該slot,這些SLOT常用於初始的數據同步等需求,例如邏輯訂閱的初始數據同步。

9. 提升hot standby replay性能,提高Access Exclusive locks的tracking效率。

10. 提升2PC事務的恢複效率。

3 QUERY

1. 添加XMLTABLE函數,可以將XML格式數據轉換為多行的結果集。

2. UPDATE SET中允許使用ROW構造器或者table.*,例如UPDATE ... SET (column_list) 。

3. 修正規則表達式的本土化BUG,允許大於U+7FF的字符使用正確的本土化設置。

4 DDL

1. 支持分區表語法,目前支持range和list分區,暫時不支持HASH分區。用戶可以使用pg_pathman插件支持hash分區。

2. 支持statement after觸發器中使用Transition table,提升性能。

《PostgreSQL 10.0 preview 功能增強 - 觸發器函數內置中間表》

3. 安全增強,支持嚴格的行安全策略(restrictive row-level security policies)

4. 允許通過ALTER DEFAULT PRIVILEGES設置schema的默認權限。

5. 帶有instead insert trigger的視圖,支持COPY命令灌數據。

6. 當函數無參數時,使用DROP FUNCTION可以隻提供函數名。

7. 允許在一條DROP命令中,刪除多個操作符、函數。

8. vacuum verbose報告跳過了多少frozen pages 以及 oldest xmin。這些信息在日誌中也會被記錄下來。

9. 提升vacuum清除末端空頁的性能。

5 數據類型

1. 全文檢索支持JSON, JSONB類型,通過ts_headline和to_tsvector接口進行轉換。

2. 支持EUI-64國際標準mac地址類型MACADDR8,macaddr為老的EUI-48標準。

3. 支持SQL標準的identity columns,實際上功能和SERIAL一致。自增序列。

4. 支持重命名枚舉類型元素值。

6 函數

1. 新增regexp_match()函數,返回第一個匹配的串,簡化使用。老的版本可以使用regexp_matches()達到同樣目的(隻是寫法略複雜)。

2. jsonb類型,支持原子刪除指定的KEYS,通過ARRAY提供KEYS進行刪除。

3. 新增一個函數txid_current_ifassigned()用於獲取當前已分配的事務號,如果未分配,返回NULL。之前txid_current()也有這個功能,但是如果未分配,txid_current會申請一個事務號並返回。所以txid_current不能在standby使用,而txid_current_ifassigned可以在standby使用。

4. 新增txid_status()函數,可以檢查XID(事務)的狀態,是否已提交。

5. 允許make_date()使用負的BC year值。

6. to_timestamp() , to_date() 將檢測時間有效性,to_date('2009-06-40','YYYY-MM-DD')將報錯,不再轉換為'2009-07-10'。

7 服務端編程

1. 允許pl/python對象調用遊標和執行動態SQL。

2. 允許將PL/pgSQL GET DIAGNOSTICS接收的信息輸入ARRAY變量。

3. 移除服務端編程接口 SPI_push(), SPI_pop(), SPI_restore_connection() 。

4. 允許PL/Tcl函數返回複合類型和SRF。

5. PL/Tcl 支持子事務命令,如果子事務異常,不會回滾整個事務。

6. 添加PL/Tcl初始化參數,pl/tcl裝載時,自動調用pltcl.start_proc , pltclu.start_proc設置的程序。

8 客戶端接口

1. libpq支持配置多個主機名、端口。libpq自動連接到第一個正常響應的數據庫。

2. libpq支持配置多個主機名、端口,並且允許配置每一對主機名端口的target_session_attrs,是否支持讀寫。

適合物理流複製,一主多備的讀寫分離場景。

3. libpq支持密碼文件,不需要再連接中配置密碼了,以往也可以通過設置環境變量實現。

4. ecpg的版本號更新,以後ECPG版本號將與PG的發布版本保持一致。

9 客戶端應用程序

psql

1. psql 客戶端支持\if, \elif, \else, \endif?用法。

2. psql 客戶端?\set?將列出已設置的變量。

3. TAB 補齊功能增強。

10 服務端應用程序

1. pg_receivewal 流式WAL接收,支持流式壓縮。option -Z/--compress

2. pg_recvlogical 流式邏輯複製客戶端,支持指定開始位置和結束位置。?--startpos , --endpos

3. pg_restore 邏輯還原命令,支持排除schemas。?-N/--exclude-schema

4. pg_dump 邏輯備份命令,可以不備份大對象了。?--no-blobs

5. pg_dumpall 邏輯備份命令,可以不備份用戶密碼,這樣的話普通用戶也能調用pg_dumpall。?--no-role-passwords

6. pg_dump and pg_dumpall 默認備份完成後,對備份文件調用fsync落盤,通過--no-sync關閉。

7. pg_basebackup 支持雙流同時流式備份數據文件、WAL文件。支持tar模式。

8. pg_basebackup使用臨時replication slots,會話結束自動清除SLOT。

9. pg_basebackup 自動跳過不需要備份的目錄,跳過哪些目錄參考文檔。

10. pg_ctl 添加一個選項,是否等待備庫激活完成。wait (--wait) and no-wait (--no-wait)

11 源碼

1. 版本號規則變更,第一個數字表示major號,第二個數字表示minor號。不在使用第三個數字。

也就是說10之後,下一個版本是11。

2. 支持ICU國際化LIB庫,避免GCC LIB庫不通用的問題。

《PostgreSQL 10.0 preview 功能增強 - 國際化功能增強,支持ICU(International Components for Unicode)》?Automatically mark all PG_FUNCTION_INFO_V1 functions as DLLEXPORT-ed on Windows (Laurenz Albe)

3. 支持動態分配共享內存。

4. 在Linux, BSD係統中使用POSIX semaphores 代替 SysV semaphores,再也不用擔心SYSV不夠用了。

請參考,《PostgreSQL on Linux 最佳部署手冊》

5. 支持slab-like內存分配器,分配固定大小內存更加有效。

6. 增強支持64-bit原子操作,支持ARM64 64bit原子操作。

7. 優先使用clock_gettime()獲取時間,代替gettimeofday()。提升獲取時間性能。

8. 支持更安全的隨機數生成器,當使用cryptographic時。

9. 使用XSLT代替Jade, DSSSL, JadeTex生成PostgreSQL手冊。

12 插件

1. file_fdw插件,允許從外部程序(例如shell程序)的標準輸出攝取數據。

2. postgres_fdw插件,支持聚合操作下推,sharding更加完美。

3. postgres_fdw插件,允許FULL JOIN下推。

4. postgres_fdw插件,支持OID列。

5. btree_gist, btree_gin支持枚舉、UUID類型。

6. amcheck插件,支持btree索引的DEBUG。

7. pg_stat_statements插件,使用$N代替?,表示變量占位符。

8. cube插件,增強0維數據的支持。

9. pg_buffercache插件,降低鎖需求,減少衝突。

10. pgstattuple插件,添加pgstathashindex()函數接口,查看hash index統計信息。

11. pgstattuple插件,支持GRANT,普通用戶可以調用pgstattuple插件。

12. pgstattuple插件,當檢車hash索引時,降低鎖需求。

13. pageinspect插件,新增page_checksum()接口,支持hash index page的檢查,新增bt_page_items()接口打印b-tree索引的item信息。

小結

PostgreSQL 10,越來越像一個HTAP數據庫了,quorum base多副本 \ sharding增強 \ 分布式事務 \ 邏輯訂閱 \ JIT框架 \ 多核計算增強 \ 國際化增強 \ 客戶端驅動balance 等。

其他文檔

《PostgreSQL 10.0 preview 功能增強 - SQL執行剩餘時間 - 垃圾回收過程可視pg_stat_progress_vacuum》

《PostgreSQL 10.0 preview 功能增強 - 邏輯訂閱端worker數控製參數》

《PostgreSQL 10.0 preview 功能增強 - 串行隔離級別 預加鎖閾值可控》

《PostgreSQL 10.0 preview 性能增強 - hash,nestloop join優化(聰明的優化器是這樣的)》

《PostgreSQL 10.0 preview 性能增強 - 支持64bit atomic》

《PostgreSQL 10.0 preview 功能增強 - 增加ProcArrayGroupUpdate等待事件》

《PostgreSQL 10.0 preview 功能增強 - 更強可靠性, 過去式事務狀態可查(杜絕unknown事務)》

《PostgreSQL 10.0 preview 性能提升 - radix tree提升字符編碼轉換性能》

《PostgreSQL 10.0 preview 變化 - pg_xlog,pg_clog,pg_log目錄更名為pg_wal,pg_xact,log》

《PostgreSQL 10.0 preview 功能增強 - WAL一致性校驗》

《PostgreSQL 10.0 preview 功能增強 - 增加access method CHECK接口amcheck》

《PostgreSQL 10.0 preview 功能增強 - libpq支持多主機連接(failover,LB)讓數據庫HA和應用配合更緊密》

《PostgreSQL 10.0 preview 變化 - 邏輯複製pg_hba.conf變化,不再使用replication條目》

《PostgreSQL 10.0 preview 功能增強 - BRIN 索引更新smooth化》

《PostgreSQL 10.0 preview 功能增強 - 觸發器函數內置中間表》

《PostgreSQL 10.0 preview sharding增強 - 支持分布式事務》

《PostgreSQL 10.0 preview 功能增強 - 動態視圖pg_stat_activity新增數據庫管理進程信息》

《PostgreSQL 10.0 preview 性能增強 - hashed aggregation with grouping sets(多維分析)更快,更省內存》

《PostgreSQL 10.0 preview 功能增強 - 自由定義統計信息維度》

《PostgreSQL 10.0 preview 功能增強 - 國際化功能增強,支持ICU(International Components for Unicode)》

《PostgreSQL 10.0 preview 功能增強 - 支持分區表ON CONFLICT .. DO NOTHING》

《PostgreSQL 10.0 preview 性能增強 - 推出JIT開發框架(朝著HTAP邁進)》

《PostgreSQL 10.0 preview 功能增強 - 備庫支持邏輯訂閱,訂閱支持主備漂移了》

《PostgreSQL 10.0 preview 性能增強 - GIN索引vacuum鎖降低》

《PostgreSQL 10.0 preview 功能增強 - 流複製統計視圖pg_stat_replication增強, 新增時間維度延遲評估》

《PostgreSQL 10.0 preview 功能增強 - CLOG oldest XID跟蹤》

《PostgreSQL 10.0 preview 功能增強 - 邏輯複製支持並行COPY初始化數據》

《PostgreSQL 10.0 preview 性能增強 - Write Amplification Reduction Method (WARM)消除某些情況下的INDEX寫放大》

《PostgreSQL 10.0 preview 功能增強 - 後台運行(pg_background)》

《PostgreSQL 10.0 preview 功能增強 - 回滾範圍可精細控製(事務、語句級)》

《PostgreSQL 10.0 preview 功能增強 - 客戶端ACL(pg_hba.conf動態視圖)》

《PostgreSQL 10.0 preview 多核並行增強 - 控製集群並行度》

《PostgreSQL 10.0 preview 安全增強 - 任意wal副本數,金融級高可用與可靠性並存需求》

《PostgreSQL 10.0 preview 性能增強 - hash index metapage cache、高並發增強》

《PostgreSQL 10.0 preview 性能增強 - mergesort(Gather merge)》

《PostgreSQL 10.0 preview 多核並行增強 - 索引掃描、子查詢、VACUUM、fdw/csp鉤子》

《PostgreSQL 10.0 preview 性能增強 - CLOG group commit》

《PostgreSQL 10.0 preview 功能增強 - OLAP增強 向量聚集索引(列存儲擴展)》

《PostgreSQL 10.0 preview 功能增強 - SQL:2016標準(之SQL/JSON) Oracle 12c兼容》

《PostgreSQL 10.0 preview 功能增強 - identify column (SQL標準:T174)》

《PostgreSQL 10.0 preview 功能增強 - 分區表(list default)》

《PostgreSQL 10.0 preview 功能增強 - 分區表(hash,range,list)》

《PostgreSQL 10.0 preview 功能增強 - 支持EUI-64格式MAC地址類型》

《PostgreSQL 10.0 preview 功能增強 - JSON 內容全文檢索》

《PostgreSQL 10.0 preview 功能增強 - 唯一約束+附加字段組合功能索引》

《PostgreSQL 10.0 preview 功能增強 - 匿名、自治事務(Oracle 兼容性)(background session)》

《PostgreSQL 10.0 preview 性能增強 - 間接索引(secondary index)》

《PostgreSQL 10.0 preview sharding增強 - pushdown 增強》

《PostgreSQL 10.0 preview 功能增強 - slave提前蘇醒》

《PostgreSQL 10.0 preview 功能增強 - slave支持WAITLSN 'lsn', time;用於設置安全replay柵欄》

《PostgreSQL 10.0 preview 功能增強 - hash index 支持wal(災難恢複)》

《PostgreSQL 10.0 preview 性能增強 - 分區表子表元信息搜索性能增強》

《PostgreSQL 10.0 preview 性能增強 - libpq支持pipeline batch模式減少網絡交互提升性能》

《PostgreSQL 10.0 preview 性能增強 - OLAP提速框架, Faster Expression Evaluation Framework(含JIT)》

《PostgreSQL 10.0 preview 性能增強 - pg_xact align(cacheline對齊)》

《PostgreSQL 10.0 preview 流複製增強 - 支持可配置的wal send max size》

《PostgreSQL 10.0 preview sharding增強 - 支持Append節點並行》

《PostgreSQL 10.0 preview 優化器改進 - 不完整索引支持複合排序》

《PostgreSQL 10.0 preview 性能增強 - 2PC事務恢複階段性能提升》

《PostgreSQL 10.0 preview 多核並行增強 - 並行hash join支持shared hashdata, 節約哈希表內存提高效率》

《PostgreSQL 10.0 preview sharding增強 - postgres_fdw 多節點異步並行執行》

《PostgreSQL 10.0 preview 功能增強 - 自動預熱shared buffer (auto prewarm)》

《PostgreSQL 10.0 preview 多核並行增強 - tuplesort 多核並行創建索引》

《PostgreSQL 10.0 preview 功能增強 - QUERY進度顯示》

《PostgreSQL 10.0 preview 功能增強 - 角色化權限管理 - 新增幾個內置角色(統計信息查看、管理用戶會話)》

《PostgreSQL 10.0 preview 功能增強 - 新增數十個IO等待事件監控》

《PostgreSQL 10.0 preview 主動防禦 - 可配置是否允許執行不帶where條件的update\delete》

《PostgreSQL 10.0 preview 安全增強 - SASL認證方法 之 scram-sha-256 安全認證機製》

《PostgreSQL 10.0 preview 邏輯複製 - 原理與最佳實踐》

《PostgreSQL 10.0 preview 流複製增強 - 流式接收端在線壓縮redo》

《PostgreSQL 10.0 preview - 截至2017元旦裝備了哪些核武器》

《PostgreSQL 10.0 preview 功能增強 - 內置分區表》

參考

https://www.postgresql.org/docs/devel/static/release-10.html

最後更新:2017-05-09 20:31:43

  上一篇:go 海量數據 "寫入、共享、存儲、計算" 最佳實踐
  下一篇:go 阿裏專家直擊前端盛會JSConf2017 Day2