Presto CREATE VECTOR INDEX 语句详解:语法、属性与底层实现
大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载导读本文深入解析 Presto 分布式 SQL 查询引擎中用于创建向量检索索引的CREATE VECTOR INDEX语句。通过阅读本文你将掌握该语句的完整语法结构、WITH属性index_type、distance_metric、index_options、partitioned_by的配置方法与UPDATING FOR分区过滤用法并通过源码层面理解 Presto 如何解析、校验并最终由连接器落地这一索引构建任务。什么是向量索引在 AI 与机器学习场景下数据表中常包含由 embedding 模型生成的向量列如array(real)或array(double)类型。向量索引Vector Index用于加速基于向量相似度的检索查询例如基于余弦相似度cosine similarity的近似最近邻ANN搜索。CREATE VECTOR INDEX语句的作用是在源表的指定列上创建一个向量搜索索引。该语句是 Presto 中建索引类 DDL 的一部分索引的实际构建由支持向量索引的连接器Connector完成。当前仓库中Lance 连接器 是一类面向机器学习工作负载、支持标量与向量索引数据的列式存储连接器。语句语法Synopsis以下为该语句的完整语法来自 create-vector-index.rstCREATE VECTOR INDEX index_name ON source_table ( column_name [, ...] ) [ WITH ( property_name expression [, ...] ) ] [ UPDATING FOR predicate ]从 ANTLR 语法文件 SqlBase.g4 中可以看到与之完全对应的文法规则| CREATE VECTOR INDEX qualifiedName ON qualifiedName ( identifier (, identifier)? ) (WITH properties)? (UPDATING FOR booleanExpression)? #createVectorIndex该语法树被构造成 AST 节点 CreateVectorIndex其中包含五个核心字段indexName索引名称QualifiedName可为多级命名tableName源表名称QualifiedNamecolumns待索引的列名列表ListIdentifierupdatingFor可选的UPDATING FOR过滤表达式OptionalExpressionproperties可选的WITH属性列表ListPropertyON子句要求至少指定一列文法中为identifier (, identifier)?这与解析器 AstBuilder.visitCreateVectorIndex 中对列列表的流式解析一致。子句详解列列表标识列 向量列column_name列表指定要建立索引的列。典型用法是包含一个标识列identifier column如主键或唯一 ID和一个 embedding向量列CREATE VECTOR INDEX my_index ON my_table(content_id, embedding)这里content_id是标识列embedding是向量列。类型约束最后一个列必须是向量列其类型必须为array(real)或array(double)。这一约束在分析器中有明确校验见下文“源码级的校验规则”一节。支持 1 参数仅向量列与 2 参数标识列 向量列两种形式。WITH 子句索引属性可选的WITH子句用于设置索引属性属性以property_name expression键值对形式给出多个属性用逗号分隔。文档中列出的常用属性包括属性名作用说明示例值index_type向量索引的类型ivf_rabitq4distance_metric距离度量方式cosineindex_options额外的索引配置nlist100000,nb8partitioned_by分区列ARRAY[ds]其中index_type指定索引算法类型。示例值ivf_rabitq4是 IVFInverted File倒排文件类近似最近邻索引的一种变体rabitq 为带量化压缩的变体常用于大规模向量的近似检索。distance_metric指定向量间距离/相似度的度量方式cosine余弦相似度是最常见的选项之一适合文本 embedding 等归一化场景。index_options以keyvalue字符串形式传入索引算法参数。示例中nlist100000表示 IVF 聚类中心centroid的数量nb8表示构建时的批量大小batch size这类参数直接影响索引的召回率与构建性能。partitioned_by指定索引按哪些列进行分区使用ARRAY[...]语法列出分区列名。当源表按日期如ds等列分区时可让索引与表分区对齐。属性值必须是常量表达式常量分析器会校验这一点并且不允许重复定义同名属性。UPDATING FOR 子句按谓词过滤源数据可选的UPDATING FOR子句使用一个谓词predicate过滤源数据其作用类似WHERE子句。它通常用于指定要为哪些分区构建索引——例如只对最近几天的数据分区增量构建索引避免每次都对全表重建UPDATING FOR ds BETWEEN 2024-01-01 AND 2024-01-03在分析器实现中UPDATING FOR的谓词会通过analyzeWhere进行分析校验列引用、类型等因此其中的列引用必须存在于源表中。完整示例创建一个按日期分区构建的向量索引示例来自 create-vector-index.rstCREATE VECTOR INDEX my_index ON my_table(content_id, embedding) WITH ( index_type ivf_rabitq4, distance_metric cosine, index_options nlist100000,nb8, partitioned_by ARRAY[ds] ) UPDATING FOR ds BETWEEN 2024-01-01 AND 2024-01-03该语句的含义是在表my_table上基于content_id标识列与embedding向量列创建一个名为my_index的向量索引索引类型为ivf_rabitq4距离度量采用余弦相似度并配置nlist100000, nb8的索引参数索引按ds列分区并且只针对ds处于2024-01-01至2024-01-03之间的数据构建。源码级的校验规则CREATE VECTOR INDEX语句经过解析生成 AST 后由分析器 StatementAnalyzer.visitCreateVectorIndex 执行一系列语义校验。校验顺序与规则如下源表必须存在解析ON后的源表名若metadataResolver.tableExists返回 false抛出MISSING_TABLE异常Source table xxx does not exist。列不能重复对columns列表逐项去重重复时报DUPLICATE_COLUMN_NAMEColumn name xxx specified more than once。列必须存在于源表通过metadataResolver.getColumnHandles获取源表列句柄逐列检查缺失时报MISSING_COLUMN。最后一列必须是向量列取列列表的最后一列作为 embedding 列其类型必须是ArrayType且元素类型为RealType或DoubleType否则抛出TYPE_MISMATCHEmbedding column xxx must be of type array(real) or array(double), but was ...。UPDATING FOR谓词合法通过analyzeWhere校验谓词中的列引用、类型与常量性。属性合法属性值必须是常量表达式createConstantAnalyzer校验不允许重复属性名不允许引用未解析的符号。权限检查用户需对源表具备读取权限对目标索引名具备TABLE_CREATE权限。这些校验规则在单元测试 TestAnalyzer.testCreateVectorIndex 中被系统性地覆盖包括成功场景双列、单列、带WITH、带UPDATING FOR、源表不存在、列不存在、重复列、embedding 列类型错误、重复属性、未解析的属性值、UPDATING FOR引用不存在的列等。例如analyze(CREATE VECTOR INDEX test_index ON t14(id, embedding_real)); analyze(CREATE VECTOR INDEX test_index ON t14(id, embedding_real) WITH (p1 val1) UPDATING FOR id BETWEEN 1 AND 100); assertFails(MISSING_TABLE, .*Source table .* does not exist, CREATE VECTOR INDEX test_index ON nonexistent_table(a, b)); assertFails(TYPE_MISMATCH, .*Embedding column name must be of type array\\(real\\) or array\\(double\\).*, CREATE VECTOR INDEX test_index ON t14(id, name));从源码结构看这一测试体系保证了该语句在各种合法与非法输入下都能给出明确、可预期的行为。从分析到执行索引构建链路分析阶段完成后CREATE VECTOR INDEX的构建请求会通过元数据接口下发到具体连接器。在 Metadata 接口中定义了如下两个 SPI 方法default OutputTableHandle beginCreateVectorIndex(Session session, String catalogName, ConnectorTableMetadata indexMetadata, OptionalNewTableLayout layout, SchemaTableName sourceTableName) { throw new PrestoException(NOT_SUPPORTED, This connector does not support creating vector indexes); } default OptionalConnectorOutputMetadata finishCreateVectorIndex(Session session, OutputTableHandle tableHandle, CollectionSlice fragments, CollectionComputedStatistics computedStatistics) { throw new PrestoException(NOT_SUPPORTED, This connector does not support creating vector indexes); }也就是说并非所有连接器都支持向量索引。这两个方法带有 default 实现默认抛出NOT_SUPPORTED异常支持向量索引的连接器如 Lance需要覆写这两个方法分别完成“开始原子化创建索引并写入数据”与“数据写入完成后结束索引创建”两个阶段。DelegatingMetadataManager等元数据委托层会将调用转发给底层连接器实现。在查询规划层面还存在一个特殊的占位聚合函数 CreateVectorIndexAggregation。其类注释明确说明Dummy aggregate function for CREATE VECTOR INDEX planning. This function is never executed — the connector optimizer replaces the plan tree before execution.该聚合函数名为create_vector_index为规划阶段提供 1 参数仅 embedding与 2 参数id embedding重载且 id 支持long、double、Slice字符串三种类型embedding 支持array(real)与array(double)。它不会真正执行在执行前连接器的优化器会替换计划树将索引构建真正落地。连接器支持与相关配置支持向量索引的连接器需要在 catalog 配置中启用。以 Lance 连接器为例参见 Lance Connector 文档其 catalog 配置文件etc/catalog/lance.properties基本内容为connector.namelance lance.root/path/to/lance/data其中与索引性能相关的配置项包括配置项说明默认值lance.index-cache-size每个 worker 节点的索引缓存大小缓存标量与向量索引数据以加速过滤查询128MBlance.metadata-cache-size每个 worker 节点的元数据缓存大小减少重复查询时的 I/O128MBlance.dataset-cache-max-entries每个 worker 节点缓存的 Lance dataset 对象上限100lance.dataset-cache-ttl缓存 dataset 的 TTL60m这些缓存配置直接影响向量索引查询阶段的随机访问性能属于与向量索引主题强相关的实操配置项。与其他建表语句的关系CREATE VECTOR INDEX是 Presto 数据定义语言DDL家族的一员与建表语句配合使用。其文档页的 “See Also” 部分指向CREATE TABLE用于创建承载向量数据的源表CREATE TABLE AS用于通过查询结果创建新表例如将 embedding 结果写入向量表典型的用法是先用CREATE TABLE建立包含标识列与 embedding 列的表并写入数据再通过CREATE VECTOR INDEX为其中的向量列建立检索索引最后利用向量索引加速相似度查询。小结CREATE VECTOR INDEX是 Presto 面向向量检索场景提供的一类建索引 DDL语法上由ON列列表、WITH属性、UPDATING FOR谓词三部分组成分别决定索引对象、索引算法参数与构建范围语义上要求最后一列为array(real)或array(double)向量列并经过分析器的完整校验表存在性、列存在性、重复性、类型、属性常量性、权限执行上通过Metadata.beginCreateVectorIndex/finishCreateVectorIndexSPI 交由连接器实现规划阶段使用create_vector_index占位聚合函数最终由连接器优化器替换计划树完成真正的索引构建是否支持该语句取决于所配置的连接器如 Lance不支持时抛出不支持异常。掌握这一语句即可在 Presto 中为 AI/ML 工作负载的向量数据构建可检索的索引并结合UPDATING FOR实现分区级、增量的索引维护策略。赞分享大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载相关推荐Presto CREATE SCHEMA 语句完全指南语法、语义与底层实现解析Presto CREATE SCHEMA 语句完全指南语法、语义与底层实现解析 导读 CREATE SCHEMA 是 Presto 分布式 SQL 查询引擎中大数据数据库后端StarRocks CREATE DATABASE 语句详解语法、参数、权限与底层实现StarRocks CREATE DATABASE 语句详解语法、参数、权限与底层实现 CREATE DATABASE 是 StarRocks 中用于创建数据数据库OLAP数据仓库大数据湖仓一体数据分析Presto CREATE TABLE AS 语句完全指南语法、表属性与 CTAS 实战Presto CREATE TABLE AS 语句完全指南语法、表属性与 CTAS 实战 本指南基于 Presto 官方文档中 CREATE TABLE AS大数据数据库后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Rust+Tauri数据库工具DBX:20MB无感交互与本地AI SQL实践

Rust+Tauri数据库工具DBX:20MB无感交互与本地AI SQL实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:03:48 阅读更多 →
codeburn sync 技术全解:从 OIDC/PKCE 认证到 OTLP 遥测推送的本地优先架构

codeburn sync 技术全解:从 OIDC/PKCE 认证到 OTLP 遥测推送的本地优先架构

【免费下载链接】codeburn Free, local tool to track AI coding token usage and cost across 37 tools and agents (Claude Code, Cursor, Codex, Gemini and more), by model, project, and task. npx codeburn 项目地址: https://gitcode.com/gh_mirrors/co/cod…

2026/9/24 7:03:48 阅读更多 →
Buck芯片参数耦合实操指南:电感选型、BOOT电阻与COT架构

Buck芯片参数耦合实操指南:电感选型、BOOT电阻与COT架构

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:03:48 阅读更多 →

最新新闻

ESP32脑电波控制空调:从BCI信号采集到红外发射的完整实战

ESP32脑电波控制空调:从BCI信号采集到红外发射的完整实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:47:13 阅读更多 →
从 GraphRAG 到 ColQwen:大模型文本分析有哪些新玩法?

从 GraphRAG 到 ColQwen:大模型文本分析有哪些新玩法?

温馨提示:若页面不能正常显示数学公式和代码,请阅读原文获得更好的阅读体验。 作者: 艾米丽 (连享会) 邮箱: lianxhcn163.com Title: 从 GraphRAG 到 ColQwen:大模型文本分析有哪些新玩法?Keywords: 语义标…

2026/9/24 7:47:13 阅读更多 →
充电桩通信模块三重设计:PWM/PLC/CAN协同与鲁棒性实战

充电桩通信模块三重设计:PWM/PLC/CAN协同与鲁棒性实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:47:13 阅读更多 →
GD32450Z-EVAL 开发板 RT-Thread BSP 快速上手与进阶配置指南

GD32450Z-EVAL 开发板 RT-Thread BSP 快速上手与进阶配置指南

操作系统嵌入式物联网嵌入式OSRTOS 【免费下载链接】rt-thread RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/ 项目地址: https://gitcode.com/gh_mirrors/rt/rt-thread 点击查看 免费下载 本指南以…

2026/9/24 7:47:13 阅读更多 →
MOS管开关损耗总对不上?非本征电容在作祟

MOS管开关损耗总对不上?非本征电容在作祟

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 7:47:13 阅读更多 →
STM32F103寄存器方式流水灯实验报告

STM32F103寄存器方式流水灯实验报告

STM32F103寄存器方式流水灯实验报告 实验引脚:PA0、PB0、PA5、PC13;低电平点亮;流水间隔1s;包含板载PC13 LED。 文章目录STM32F103寄存器方式流水灯实验报告一、实验目的二、实验环境三、硬件引脚与电路说明四、实验原理五、完整…

2026/9/24 7:46:13 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →