一、Hydra简介
Hydra 是一个列式存储扩展,旨在为 PostgreSQL 提供高性能的向量化列存储扩展。PostgreSQL 生态其实已经有一些列式存储扩展,例如 Citus 自带的 columnar
,以及 TimescaleDB 针对时序数据的压缩列存引擎。不过看起来 hydra
在这个领域又达到了新的高度:在它给出的样例场景中(500G count),它可以达到令人震惊的加速比:从四五分钟到亚秒级。兼容性也还不错,支持分区表,可以与pg_hint_plan、pg_ivm等扩展配合使用。
Hydra Fork 自 Citus 的列存插件 columnar
,但进行了许多改进优化,例如矢量化执行,查询并性化,并进行了一系列针对性的调优。hydra
目前已经发布1.0.1 Release版,目前还不支持最新的PostgreSQL 16。
二、安装
安装环境:服务器44核88线程,内存128G,硬盘5400转SATA x 3 Raid5,操作系统:Rocky Linux 9.2 (Blue Onyx),PostgreSQL 15.4。
# 安装依赖包dnf install autoconf libcurl-devel liblz4-devel libzstd-devel git clone https://github.com/hydradatabase/hydra.git -b v1.0.1 cd hydra/columnar ./autogen.sh ./configure makemake install
三、使用
-- 创建扩展,需要超级用户权限CREATE EXTENSION IF NOT EXISTS columnar;-- Hydra支持列存表(columnar)和传统的PostgreSQL堆表(heap),默认创建时是columnar表。可在建表时指定要创建的类型:CREATETABLE heap_table (...) USING heap;CREATETABLE columnar_table (...) USING columnar;-- Hydra支持列存、行存相互转换CREATETABLE my_table (i INT8) USING heap;-- convert to columnarSELECT columnar.alter_table_set_access_method('my_table','columnar');-- convert back to row (heap)SELECT columnar.alter_table_set_access_method('my_table','heap');--也支持通过拷贝数据手动转换CREATETABLE table_heap (i INT8) USING heap;CREATETABLE table_columnar (LIKE table_heap) USING columnar;INSERTINTO table_columnar SELECT*FROM table_heap;--支持分区表,分区表可以是heap表,也可以是columna表CREATETABLE parent(ts timestamptz, i int, n numeric, s text)PARTITION BY RANGE (ts);-- columnar partitionCREATETABLE p0 PARTITION OF parent FOR VALUESFROM('2020-01-01') TO ('2020-02-01')USING columnar;-- columnar partitionCREATETABLE p1 PARTITION OF parent FOR VALUESFROM('2020-02-01') TO ('2020-03-01')USING columnar;-- row partitionCREATETABLE p2 PARTITION OF parent FOR VALUESFROM('2020-03-01') TO ('2020-04-01')USING heap;INSERTINTO parent VALUES('2020-01-15',10,100,'one thousand');-- columnarINSERTINTO parent VALUES('2020-02-15',20,200,'two thousand');-- columnarINSERTINTO parent VALUES('2020-03-15',30,300,'three thousand');-- row
四、实测
导入生产环境数据到测试环境,其中一张表5000万+行数据,一张表1.2亿+行,两张与若干辅表join,然后聚合,heap表耗时40s,将两张大表转换成columnar表,耗时仅1.7s,性能提升巨大。空间占用情况:1.2亿+行数据的表heap表时占用空间40G+,转换成columnar表后仅占用5.2G,空间节省也很可观。但转换表时需要注意:如果heap表有序列或者字段带有generated by default as identity 属性,转换时可能会报错,建议先删除相应属性再转换,转换完成后再重新设置。
五、限制
- 不支持逻辑复制
- 不支持ON CONFLICT子句
- 在某些情况下,索引可能会导致查询变慢,大部分情况下索引不是必须的
- 不支持BRIN索引