pg_sorted_heap 0.13.0 发布

发布于 2026-05-05,Sergey "Computer Mage" Kuznetsov
相关开源软件

我很高兴宣布发布 pg_sorted_heap 0.13.0:这是一个 PostgreSQL 扩展,提供物理有序堆存储Zone Map 裁剪、与规划器集成的向量检索,以及一种“面向事实(fact-shaped)”的 GraphRAG 查询接口。

仓库:

  • https://github.com/skuznetsov/pg_sorted_heap

版本发布:

  • https://github.com/skuznetsov/pg_sorted_heap/releases/tag/v0.13.0

pg_sorted_heap 是什么?

pg_sorted_heap 是一个 PostgreSQL 扩展,主要提供:

  • sorted_heap:一种表访问方法(Table Access Method),按主键让行在物理上保持有序,并通过“每页 zone map”对堆块进行裁剪。
  • sorted_hnsw:与规划器集成的 HNSW 索引访问方法,面向 PostgreSQL 内置的向量类型。
  • svechsvec:PostgreSQL 的 float32 / float16 向量类型。
  • 面向事实的 GraphRAG 辅助函数:在 PostgreSQL 内部直接检索与重排图结构事实(graph-shaped facts)。

存储侧主要面向物理局部性很关键的负载:时序数据、事件日志、IoT 读数、有序 ID,以及在主键列上大量使用范围谓词的大表。

向量与 GraphRAG 侧主要面向希望把检索留在 PostgreSQL 内部的应用,而不是再引入一个独立的向量检索 sidecar。

0.13.0 有哪些更新?

0.13.0 的主要变化是:狭义且“面向事实”的 GraphRAG 合约(contract)现在成为稳定版本的一部分。

稳定的 GraphRAG API 包括:

  • sorted_heap_graph_rag(...)
  • sorted_heap_graph_register(...)
  • sorted_heap_graph_config(...)
  • sorted_heap_graph_unregister(...)
  • sorted_heap_graph_rag_stats()
  • sorted_heap_graph_rag_reset_stats()

该合约刻意保持“窄接口”,面向以 (entity_id, relation_id, target_id) 聚簇(clustered)的事实表,或通过等价的已注册别名映射实现同样语义。查询流程从 ANN 种子检索开始,沿着一条或多条关系边进行扩展,随后对扩展后的候选集进行精确重排(exact rerank)。

示例:

sql SELECT * FROM sorted_heap_graph_rag( 'facts'::regclass, '[0.1,0.2,0.3,...]'::svec, relation_path := ARRAY[1, 2], ann_k := 64, top_k := 10, score_mode := 'path' );

0.13.0 还为多分片/多租户应用流程提供了一个稳定的“路由式(routed)”GraphRAG 入口:

  • sorted_heap_graph_route(...)
  • sorted_heap_graph_route_plan(...)

这使得应用可以通过一个统一的调度器处理精确键路由、范围路由、profiles、策略与默认值。

其他亮点

0.13.0 还包括:

  • 为非规范(non-canonical)的事实表提供 schema 注册,使 GraphRAG 可以复用既有列名。
  • 进程本地的 GraphRAG 阶段统计:seed 数量、扩展行数、重排行数、返回行数,以及各阶段耗时。
  • 在扩展升级、dump/restore、崩溃恢复、并发在线 compact、并发在线 merge 等流程上的生命周期加固。
  • 修复了 sorted_hnsw 在共享缓存、多索引负载下的正确性问题。
  • sorted_hnsw.build_sq8:可选的低内存索引构建模式,适用于资源受限的构建环境。
  • 实验性的 FlashHadamard 检索路径:有文档与测试,但不是默认 ANN 路径,也不属于稳定 GraphRAG 合约的一部分。

基准测试快照

以下为发布说明中的特定负载基准快照,并非通用性能结论。

AWS Gutenberg 负载(约 104K x 2880D,top-10):

  • sorted_hnsw (svec)1.287 ms100.0% Recall@10
  • sorted_hnsw (hsvec)1.404 ms100.0% Recall@10
  • pgvector halfvec2.031 ms99.8% Recall@10

AWS 面向事实的多跳 GraphRAG 负载(5K chains,384D):

  • sorted_heap_expand_twohop_path_rerank():中位数 0.962 ms
  • sorted_heap_graph_rag_twohop_path_scan():中位数 1.025 ms
  • pgvector 对照行:中位数 1.434 ms
  • Qdrant 对照行:中位数 3.355 ms

安装

要求:

  • PostgreSQL 17 或 18
  • 标准 PGXS 构建工具链,PATH 中可找到 pg_config

从源码构建:

bash git clone https://github.com/skuznetsov/pg_sorted_heap.git cd pg_sorted_heap make make install

启用扩展:

sql CREATE EXTENSION pg_sorted_heap;

升级已有安装:

sql ALTER EXTENSION pg_sorted_heap UPDATE TO '0.13.0';

最小示例

创建一张物理有序表:

```sql CREATE TABLE events ( id bigint PRIMARY KEY, ts timestamptz, payload text ) USING sorted_heap;

SELECT sorted_heap_compact('events'::regclass); ```

创建一个与规划器集成的 HNSW 索引:

```sql CREATE TABLE documents ( id bigserial PRIMARY KEY, embedding svec(384), content text );

CREATE INDEX documents_embedding_idx ON documents USING sorted_hnsw (embedding) WITH (m = 16, ef_construction = 200);

SET sorted_hnsw.ef_search = 96;

SELECT id, content FROM documents ORDER BY embedding <=> '[0.1,0.2,0.3,...]'::svec LIMIT 10; ```

创建一张稳定的“面向事实”的 GraphRAG 表:

```sql CREATE TABLE facts ( entity_id int4, relation_id int2, target_id int4, embedding svec(384), payload text, PRIMARY KEY (entity_id, relation_id, target_id) ) USING sorted_heap;

CREATE INDEX facts_embedding_idx ON facts USING sorted_hnsw (embedding) WITH (m = 24, ef_construction = 200); ```

验证

0.13.0 的 RC 检查包括:

  • pg_sorted_heap / sorted_hnsw / graph_rag 的 SQL 回归测试覆盖
  • GraphRAG 生命周期覆盖(升级与 dump/restore)
  • 崩溃恢复检查
  • 并发在线操作检查
  • PostgreSQL 17 -> 18 的 pg_upgrade 覆盖
  • sorted_hnsw 分块/共享缓存集成检查

本地验证:

bash make test-release

更聚焦的 GraphRAG 发布包验证:

bash make test-graphrag-release

链接

  • 仓库:https://github.com/skuznetsov/pg_sorted_heap
  • 文档:https://skuznetsov.github.io/pg_sorted_heap/
  • 发布说明:https://github.com/skuznetsov/pg_sorted_heap/releases/tag/v0.13.0
  • Issues:https://github.com/skuznetsov/pg_sorted_heap/issues