深度解讀PostgreSQL 10.0版本新特性

SQL 深度學習 機器學習 MySQL IT168企業級 2017-05-16

5月11日——13日,第八屆中國數據庫技術大會(DTCC2017)在北京國際會議中心舉行。會議期間,共有近5000名IT人士到場交流分享技術理念,盛況空前。本屆DTCC大會以“數據驅動·價值發現”為主題,同時彙集了來自互聯網、電子商務、金融、電信、政府、行業協會等20多個行業領域的120多位技術專家,共同探討Oracle、MySQL、NoSQL、雲端數據庫、智能數據平臺、區塊鏈、數據可視化、深度學習等領域的前瞻性熱點話題與技術。

在13日下午的開源技術分會場上,武漢大學副教授彭煜瑋對PostgreSQL 10.0 版本的新特性進行了解讀,以幫助大家對此版本有更深入的認識與瞭解。

深度解讀PostgreSQL 10.0版本新特性

▲彭煜瑋

PostgreSQL 10.0將是更改版本號規則後的第一個發行版,社區在這個新版本中增加了豐富的新特性和加強。彭煜瑋此次解讀的內容包括功能增強、性能增強、安全性和可靠性增強、應用開發以及遷移的注意事項。

功能增強

·邏輯訂閱。在多個業務之間有少量的數據需要同步、數據彙總、數據拆分、跨雲線上線下同步等問題中,邏輯訂閱的應用是非常必要的。

·內置分區表。PostgreSQL 10.0中將加入內置分區表的功能,依舊使用了繼承的特性,但不需要手工寫規則了。PostgreSQL 10.0 分區表不支持全局索引,因此無法實現全局的唯一約束;更新數據時不能導致數據跨區移動,否則會報錯;修改主表的字段名、字段類型時,會自動同時修改所有的分區;TRUNCATE 主表時,會清除所有繼承表分區的記錄(如果有多級分區,也會一直級聯下去);目前支持分區表的ON CONFLICT .. DO NOTHING ,暫時還不支持ON CONFLICT .. DO UPDATE。

·流式接收端在線壓縮WAL。PostgreSQL 10.0 中pg_receivexlog 支持對WAL日誌在線壓縮。pg_receivexlog支持通過開關控制是否需要開啟壓縮、以及選擇壓縮級別。pg_receivexlog啟動時,自動掃描存放歸檔文件的目標目錄,選擇斷點續傳的位置,然後向PostgreSQL數據庫請求相應位置為起點的REDO。

·查看清理進度。PostgreSQL 10.0增加了對Vacuum的可視化監控;增加了動態視圖pg_stat_progress_vacuum;顯示每個vacuum worker進程掃描了多少頁面、回收了多少頁面,結合清理對象的總頁面數,可以估計進度。

·後臺運行。10.0增加了對後臺運行的支持,提供了三個SQL函數。pg_background_launch : 開啟後臺work進程與會話,執行用戶提供的SQL,返回後臺會話的PID;pg_background_result : 根據提供的PID,返回這個後臺會話執行SQL的結果;pg_background_detach : 根據提供的PID,返回這個後臺會話執行SQL的結果,同時關閉這個後臺進程。 pg_background_result還會返回執行所用的時間。

性能增強

·並行增強。10.0 新增了一個參數max_parallel_workers,用於控制整個集群允許開啟的用於多核計算的Worker進程。PostgreSQL還增加了一個對元組進行並行排序的模塊:原則上,任何現有需要調用tuplesort的功能都可以使用這個並行排序模塊基於並行排序模塊,將能夠支持B-Tree的並行創建(代價模型比較直接)。

·間接索引。10.0 引入了間接索引的概念,索引項中有堆元組的主鍵值:只要不更新堆元組的主鍵,索引鍵值不變的間接索引都不需要更新;但間接索引不能單獨服務於查詢,必須經過主鍵索引中轉;主鍵只能是小於等於 6 字節的類型。

·用不完全索引支持複合排序。用索引支持排序是很好的手段:ORDER BY a,b,c 可以利用到索引(a,b,c,*);ORDER BY a,b,c 無法利用索引(a,b)或者(a)。10.0 將使得第二種情況能夠用上(a,b)或者(a)這樣不完全包含排序列的索引:第一個階段,利用不完全的索引來做基於前幾個排序列的排序;第二個階段,對前幾個排序列上值相等的數據,取出後面的列值進行單獨排序。當前幾個排序列的值分佈得比較散時這種利用索引的方法效果比較好。

·自動預熱共享緩存。10.0 中增加了自動預熱共享緩存的技術:建立一個預熱器後臺進程,它在系統關閉時把緩衝池中的數據塊信息轉儲到文件中;重啟時,預熱器自動把轉儲出來的數據塊重新載入到緩存中。

·JIT支持。PostgreSQL 10.0 已經開始為 JIT 做鋪墊,把SQL執行的框架從遞歸調用方式改成了非遞歸的opcode驅動模式,非遞歸式降低了棧使用和開銷,可以在不同的子表達式之間共享一些狀態,簡單函數以簡單跳轉實現而不需函數調用。

安全性和可靠性

·安全性增強。PostgreSQL SCRAM機制基於RFC文檔 5802 、7677實現,目前只支持SCRAM-SHA-256算法,但是基於SASL認證方法,未來可以支持更多的更強的算法。SCRAM相比md5,可以避免因為數據庫存儲的加密祕鑰洩露導致客戶端可以篡改認證協議連接數據庫的危險。由於SCRAM和md5不兼容,二者只能選其一。

·新增內置角色。PostgreSQL 10.0 開始植入了一些內置的角色:pg_backend_pid:可用來取消、中止任何進程,不包含其他超級用戶權限;pg_monitor:可以查看統計信息,便於DBA等檢查數據庫健康狀態;pg_read_all_gucs:可以查看所有的 GUC 配置。未來PostgreSQL還會對植入更多的內置角色,讓數據庫的權限分組管理更加便捷。逐步形成像Oracle這樣內部有許多角色可選的狀況。

·防止執行不帶條件的更新/刪除。不帶條件的更新/刪除很危險,正常情況下,這樣的SQL不應該在業務邏輯中出現。通常出現在SQL注入或者誤操作中。10.0 提供了一個參數來防止此類SQL,bool allow_empty_deletes = true;bool allow_empty_updates = true;分別控制是否能執行不帶條件的Update或Delete,可以設置為全局、會話級、用戶級、庫級、或者事務級別。

·WAL日誌支持的Hash索引。很長一段時間,PG中的Hash索引是不做WAL日誌的,因此數據庫崩潰可能會導致Hash索引不可用。10.0 中為Hash索引的操作加上了WAL支持,現在對Hash索引的創建、插入、分裂等操作都會記錄WAL日誌,數據庫崩潰後可以用這些信息來恢復索引

應用開發

·Libpq增強。支持pipeline batch模式,增加多連接功能。

·標準/兼容性支持。增加類似serial的identify column:雖然已經可以使用serial來達到同樣效果,不過實現這一標準,可以兼容更多的數據庫。

遷移的注意事項

使用pg_upgrade升級時,Hash索引需要重建;XLOG相關的系統管理函數重命名,xlog改為wal;不再支持浮點 datetimes/timestamps類型,編譯項--disable-integer-datetimes去除;不再支持client/server protocol version 1.0;不再支持contrib/tsearch2;不再支持version-0版本的C語言函數。

自PostgreSQL發佈以來就受到了眾多DBA的喜愛,而且廣受好評,此次10.0版本的更新想必也時刻牽動著PostgreSQL粉絲們的心。一年一個大版本是PostgreSQL社區的傳統,不過發佈時間通常為秋天,仍需等待一段時間。看到如此“巨大”的升級更新,大家一定都迫不及待了吧。

相關推薦

推薦中...