《深度解讀PostgreSQL 10.0版本新特性》要點:
本文介紹了深度解讀PostgreSQL 10.0版本新特性,希望對您有用。如果有疑問,可以聯系我們。
相關主題:PostgreSQL教程
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 分區表不支持全局索引,因此無法實現全局的唯一約束;更新數據時不能導致數據跨區移動,否則會報錯;修改主表的字段名、字段類型時,會自動同時修改所有的分區;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社區的傳統,不過發布時間通常為秋天,仍需等待一段時間.看到如此“巨大”的升級更新,大家必定都迫不及待了吧.
《深度解讀PostgreSQL 10.0版本新特性》是否對您有啟發,歡迎查看更多與《深度解讀PostgreSQL 10.0版本新特性》相關教程,學精學透。維易PHP學院為您提供精彩教程。