PostgreSQL 上的向量搜索实践

本文整理自 IvorySQL 2025 生态大会暨 PostgreSQL 高峰论坛的演讲分享,演讲嘉宾:高策,TensorChord CEO。

引言

本文主要分享如何在 PostgreSQL 上进行向量的搜索。

PostgreSQL 有非常多的 Extension,我们可以通过 Extension 的方式去扩展 PostgreSQL 能够支持的数据类型。这是 PostgreSQL 在全球流行的一个重要原因。

我们可以把向量理解为一个新的数据类型。PGVector 是目前非常流行的项目,支持在 PostgreSQL 中做向量搜索。但 PGVector 同样也存在很多问题。

为了解决社区里的一些问题,我们做了 VectorChord 这个基于 PostgreSQL 的向量搜索引擎,其前身是 pgvecto.rs。

背景

90% 的数据在过去的两年被生产

在这里插入图片描述

在数字化与智能化的浪潮下,全球数据正以前所未有的速度增长。

根据统计显示,全球 90% 的数据是在 2024 年和 2025 年两年间产生的,而 2023 年之前仅占 10%。

  • 早期的数据主要由人类活动产生,增速相对平缓;
  • 近两年随着生成式 AI 的广泛应用,数据曲线出现了陡峭的上升拐点。
  • 未来几年,AI 生成数据将逐渐成为主流,占比持续攀升。

这一趋势不仅意味着数据量级的飞跃,也带来了数据利用方式的转变。传统的结构化数据已无法满足智能应用的需求,而大规模、多模态、语义化的数据将成为驱动 AI 应用和向量搜索的核心动力。

</

### 更新 PostgreSQL 向量数据库的功能或配置 为了更新 PostgreSQL 向量数据库的相关功能或配置,可以遵循以下方法和最佳实践: #### 1. **确认当前版本和支持** 确保所使用的 PostgreSQL 版本支持向量操作。例如,Amazon Aurora PostgreSQL 已经集成了向量数据库功能,允许用户高效存储和检索高维向量数据[^1]。对于标准的 PostgreSQL 实例,可能需要安装额外的扩展(如 pgvector),以启用向量计算能力。 #### 2. **安装或升级必要的扩展** 如果尚未安装 `pgvector` 或其他相关扩展,则可以通过以下命令完成安装: ```sql CREATE EXTENSION vector; ``` 此扩展提供了用于处理向量相似度搜索的核心函数和索引类型。如果已有旧版扩展,建议先卸载再重新安装最新版本,或者直接运行升级脚本来保持兼容性。 #### 3. **调整参数优化性能** 针对大规模向量数据的操作需求,合理设置 PostgreSQL 的全局配置文件 (`postgresql.conf`) 中的关键参数至关重要。这些参数包括但不限于: - `work_mem`: 控制排序和哈希表所需的内存大小。 - `shared_buffers`: 缓存数据块的数量。 - `effective_cache_size`: 数据库缓存的有效大小估计值。 具体修改方式如下所示: ```bash # 修改 postgresql.conf 文件 work_mem = '256MB' shared_buffers = '8GB' effective_cache_size = '16GB' # 重启服务使更改生效 sudo systemctl restart postgresql ``` #### 4. **创建适合的索引结构** 高效的查询依赖于恰当设计的索引方案。对于基于距离度量的最近邻搜索问题,推荐采用 Annoy、HNSW 或 IVF 等近似算法构建索引。以下是利用 HNSW 创建索引的一个例子: ```sql -- 假设存在名为 embeddings 的列来保存向量数据 CREATE INDEX ON table_name USING hnsw (embeddings); ``` #### 5. **定期维护与监控** 随着数据的增长以及业务逻辑的变化,持续关注系统表现并采取相应措施尤为重要。这涉及以下几个方面的工作: - 定期清理无用记录减少冗余; - 使用 VACUUM 和 ANALYZE 维护统计信息提高计划质量; - 跟踪慢查询日志定位瓶颈所在位置。 --- ### 示例代码展示如何更新配置 下面给出一段 Python 脚本演示动态调整连接池大小的过程: ```python import psycopg2 def update_pool_settings(dbname, user, password, host='localhost', port=5432): conn_string = f"dbname={dbname} user={user} password={password} host={host} port={port}" with psycopg2.connect(conn_string) as conn: with conn.cursor() as cur: try: # 设置最大并发数为 20 cur.execute("ALTER SYSTEM SET max_connections TO 20;") # 将变更写入磁盘 cur.execute("SELECT pg_reload_conf();") except Exception as e: print(f"Error occurred: {e}") update_pool_settings('testdb', 'admin', 'securepass') ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值