本文介紹了向量化引擎的概述、原理以及功能特性等內容。
概述
PolarDB PostgreSQL版向量化引擎是針對現有OLTP場景中的慢SQL、統計與分析類查詢、多模數據(JSON、TEXT、時空等)查詢而研發的性能加速方案。
其使用的典型場景包括:
以OLTP高并發增刪改查為主,但存在部分統計類查詢或慢SQL的場景。例如每天寫入大量的交易數據,且需要統計每小時的交易報表。一個PolarDB PostgreSQL版集群兼顧這兩類負載,無需為這部分的慢查詢維護額外的OLAP系統。
全表掃描或無法使用BTree索引的場景。例如對表中的列進行大量的
Group By
、Order By
、Count
、Sum
、Filter
、Join
等耗時操作。JSON數據類型的查詢與分析。例如在嵌套JSON中提取Key和Value,PostgreSQL傳統的TOAST機制無法很好地滿足性能需求的場景。
時空查詢與分析場景。例如基于地理網格統計時空熱力圖等。
在相同硬件規格和相同查詢并行度的環境中,向量化引擎可比PostgreSQL原生執行引擎性能提升15倍以上,詳細介紹請參考性能指標。
原理
原生的PostgreSQL執行引擎基于火山模型(Valcano Model),每個算子每次只能處理一條數據,當SQL涉及到大量數據時,會導致函數調用耗時過長。在現代數據庫執行引擎中,一般會采用向量化執行引擎來解決這類問題。其原理是利用CPU的SIMD指令來批量化處理數據,即一條CPU指令可并行處理多條數據,從而減少函數調用耗時以及Cache Miss問題,達到查詢加速的目的。
PolarDB PostgreSQL版向量化引擎的核心工作集中在兩個部分:
向量化版本的查詢算子。如
Scan
、Group By
、Order By
、Hash Join
、Filter
、Aggregation
等算子的向量化,使其能夠接受批量化的數據輸入并利用SIMD指令進行處理。與向量化引擎匹配的加速索引(即向量化加速索引,Vectorized Acceleration Index)。PolarDB PostgreSQL版向量化引擎中,加速索引與BTree索引、GiST索引類似,但存儲結構不同。一個表中可以同時創建向量化加速索引和其他類型的索引來應對不同的查詢,PolarDB PostgreSQL版優化器會根據查詢計劃的代價來選擇不同的索引。
如下圖所示,您可以為表t的c2列創建Btree索引來應對點查(SELECT * FROM t WHERE c2=10
),為c4和c5列創建加速索引來應對統計類查詢(SELECT c4, SUM(c5) FROM t GROUP BY c4
),查詢優化器會根據查詢SQL的查詢代價選擇合適的索引。
PolarDB PostgreSQL版向量化引擎會部署在主節點以及每一個只讀節點中,加速索引會存儲在底層的共享存儲中,每個節點上的向量化引擎都可以訪問。
當通過集群地址來訪問時,會根據各個節點的負載情況選擇某個節點的向量化引擎來執行,也可以通過只讀地址指定某個只讀節點執行。
功能特性
高度兼容PostgreSQL數據類型和語法,如
int
、varchar
、jsonb
、text[]
等類型。輕量化,只需要按照PostgreSQL索引的方式來管理加速索引,查詢語句不需要任何更改即可使用向量化引擎加速,對業務代碼侵入性較低。
加速索引的壓縮比更高,根據數據類型的不同,壓縮后的空間占用在行存的10%~60%之間。
支持新型時空多模態查詢加速。
支持豐富的向量化算子,如
Scan
、Group By
、Order By
、Hash Join
、Filter
、Aggregation
等常用查詢算子均已向量化,計算更快。支持并行掃描和計算,充分利用節點的計算資源。
支持分區表以及分區裁剪。
支持
CREATE TABLE AS
以及INSERT INTO SELECT
。支持冷數據轉儲到OSS,可加速冷數據的查詢與分析。
支持基于查詢代價優化查詢路由,將耗時較長的查詢自動路由到向量化引擎中。
支持Hint方式開啟/關閉查詢路由。
性能指標
查詢性能
示例規格:32C 256 GB
測試內容:以TPCH 100 GB為例,使用PostgreSQL原生并行執行引擎與向量化引擎查詢耗時。
測試結果:相同的32并行度下,PostgreSQL原生并行執行引擎耗時1783秒,PolarDB PostgreSQL版向量化引擎耗時為92秒,耗時僅為前者的1/18。其中Q1\Q2\Q9\Q13\Q16\Q18 等性能提升在30~50倍以上。
本次測試中,PostgreSQL原生并行執行引擎的耗時不包括Q15。
創建索引耗時
示例規格:32C 256 GB
測試內容:以TPCH 100 GB為例,為所有表創建完加速索引的耗時。
測試結論:共耗時72分鐘。
占用空間
示例規格:32C 256 GB
測試內容:以TPCH 100 GB為例,分別比較各個表在PolarDB PostgreSQL版行存和向量化引擎的加速索引中的空間占用情況。
測試結論:
在加速索引不包含主鍵的情況下(即:
polar_csi.enable_pk=false
),空間占用為行存表的20%。該模式適應于為靜態數據構建加速索引。在加速索引包含主鍵的情況下(即:
polar_csi.enable_pk=true
),空間占用為行存表的42%。該模式適應于為動態數據的加速索引。
表名稱 | 表中包含的數據行數 | PostgreSQL行存 | 向量化引擎的加速索引 (不包含主鍵) | 向量化引擎的加速索引 (包含主鍵) |
LINEITEM | 600,037,902 | 86 GB | 17 GB | 36 GB |
ORDERS | 150,000,000 | 20 GB | 4406 MB | 9052 MB |
PARTSUPP | 80,000,000 | 13 GB | 3452 MB | 6689 MB |
PART | 20,000,000 | 3204 MB | 487 MB | 634 MB |
CUSTOMER | 15,000,000 | 2808 MB | 992 MB | 1108 MB |
SUPPLIER | 1,000,000 | 176 MB | 63 MB | 72 MB |
NATION | 25 | 8 KB | 528 KB | 528 KB |
REGION | 5 | 8 KB | 528 KB | 528 KB |
合計 | 126 GB | 25 GB | 53 GB |