
大数据数据库后端【免费下载链接】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),仅供参考