本文介绍了向量化引擎的概述、原理以及功能特性等内容。
概述
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 |