ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Presto ALTER MATERIALIZED VIEW 详解:修改物化视图属性的完整指南

Presto ALTER MATERIALIZED VIEW 详解:修改物化视图属性的完整指南 Presto ALTER MATERIALIZED VIEW 详解修改物化视图属性的完整指南【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto导读本文基于 Presto 官方文档中的 ALTER MATERIALIZED VIEW 参考页系统讲解如何通过ALTER MATERIALIZED VIEW ... SET PROPERTIES修改已存在物化视图的属性包括完整语法、IF EXISTS语义、NULL值限制、可修改属性由 Connector 决定的机制并结合仓库中的 ANTLR 语法定义、AST 节点与 SQL 格式化源码以及 Iceberg Connector 的可修改属性清单帮助读者在实战中正确、安全地使用该语句。前置条件物化视图是实验特性在使用ALTER MATERIALIZED VIEW之前必须了解一个关键事实Presto 中的物化视图Materialized View仍处于实验阶段其 SPI 与行为可能在后续版本中发生变化。要启用新版本的物化视图实现需要在配置属性中设置experimental.legacy-materialized-views false在legacy-materialized-views仍为true即旧实现时ALTER MATERIALIZED VIEW ... SET PROPERTIES不被支持。这一点在文档中已明确警告也是该语句使用上的第一道门槛。从仓库源码看该配置项定义在 presto-docs/src/main/sphinx/admin/properties.rst配置属性类型默认值说明experimental.legacy-materialized-viewsbooleantrue是否使用旧版物化视图实现设为false启用带安全模式DEFINER/INVOKER、自动查询重写与新鲜度追踪的新实现experimental.allow-legacy-materialized-views-togglebooleanfalse是否允许在运行时通过legacy_materialized_views会话属性切换新旧实现仅建议在非生产环境用于测试与迁移对应的会话属性为legacy_materialized_views详见 properties-session.rst。语法SynopsisALTER MATERIALIZED VIEW [ IF EXISTS ] name SET PROPERTIES (property_name value [, ...])语句结构可以拆解为三个部分ALTER MATERIALIZED VIEW声明操作对象类型为物化视图[ IF EXISTS ]可选子句用于抑制对象不存在时的报错name SET PROPERTIES (property_name value [, ...])指定目标视图名与需要修改的属性和新值。语法在源码中的定义该语句的语法规则定义在 Presto 的 ANTLR 文法文件中见 SqlBase.g4| ALTER MATERIALIZED VIEW (IF EXISTS)? qualifiedName SET PROPERTIES properties #setMaterializedViewProperties与CREATE MATERIALIZED VIEW、DROP MATERIALIZED VIEW、REFRESH MATERIALIZED VIEW并列在同一组 statement 规则中。ALTER MATERIALIZED VIEW复用与ALTER TABLE相同的SET PROPERTIES结构唯一的区别是操作目标类型不同。解析得到的结果统一落到SetProperties这个 AST 节点上。该节点通过枚举Type区分目标是普通表还是物化视图见 SetProperties.javapublic class SetProperties extends Statement { public enum Type { TABLE, MATERIALIZED_VIEW, } private final Type type; private final QualifiedName tableName; private final ListProperty properties; private final boolean tableExists; // ... }在 AstBuilder.java 中visitSetMaterializedViewProperties将语法上下文转换为SetProperties节点Override public Node visitSetMaterializedViewProperties(SqlBaseParser.SetMaterializedViewPropertiesContext context) { ListProperty properties ImmutableList.of(); if (context.properties() ! null) { properties visit(context.properties().property(), Property.class); } return new SetProperties(getLocation(context), MATERIALIZED_VIEW, getQualifiedName(context.qualifiedName()), properties, context.EXISTS() ! null); }注意context.EXISTS() ! null这一行它直接把语法中是否出现IF EXISTS记录到tableExists字段中供后续分析阶段使用。反向的 SQL 格式化逻辑位于 SqlFormatter.java格式化时根据node.getType()分别输出ALTER TABLE或ALTER MATERIALIZED VIEW前缀随后按需追加IF EXISTS、视图名与SET PROPERTIES ( ... )属性列表从而保证任意 AST 都能被完整地还原成可执行的 SQL 文本。说明Description可修改的属性由 Connector 决定ALTER MATERIALIZED VIEW只能修改已存在的物化视图上的属性。具体哪些属性可以修改是 Connector 相关的connector-specific部分属性通常是决定物理存储身份的那些属性例如存储表名、存储 schema在创建时就被固定无法通过该语句修改每个 Connector 会公布自己支持的可更新属性清单权威列表请查阅 Connector 文档 中对应 Connector 的物化视图章节。IF EXISTS 语义可选的IF EXISTS子句用于抑制错误不带IF EXISTS时若目标物化视图不存在语句直接报错带IF EXISTS时若物化视图不存在错误被抑制语句静默成功不产生任何效果。该语义与DROP TABLE IF EXISTS、DROP MATERIALIZED VIEW IF EXISTS等语句保持一致。属性值限制不允许 NULL文档明确规定了两个行为约束将属性设置为NULL是不被支持的。要修改某个属性新值必须是非NULL的未在SET PROPERTIES子句中提及的属性保持原值不变。也就是说ALTER MATERIALIZED VIEW是增量式的属性修改而不是全量覆盖。执行链路从 SQL 到分析器在引擎内部ALTER MATERIALIZED VIEW语句经过语法解析、AST 构建之后进入语义分析阶段。在 StatementAnalyzer.java 中SetProperties节点通过visitSetProperties创建并分配作用域随后交由执行层调用对应 Connector 的元数据 API 完成属性变更Override protected Scope visitSetProperties(SetProperties node, OptionalScope scope) { return createAndAssignScope(node, scope); }示例Examples修改单个属性ALTER MATERIALIZED VIEW users SET PROPERTIES (x y);使用 IF EXISTS 抑制错误当视图可能不存在、又不希望语句抛错时ALTER MATERIALIZED VIEW IF EXISTS users SET PROPERTIES (x y);同时修改多个属性按照语法属性列表支持逗号分隔的多项赋值例如ALTER MATERIALIZED VIEW order_summary SET PROPERTIES ( stale_read_behavior FAIL, refresh_type INCREMENTAL );注意上面示例中的属性名取自 Iceberg Connector见下文不同 Connector 支持的属性名不同请以实际使用的 Connector 文档为准。实战以 Iceberg Connector 为例的可修改属性Iceberg Connector 是当前仓库中对物化视图支持最完整的 Connector。在其 文档 中物化视图的表属性被明确标注了是否可通过ALTER MATERIALIZED VIEW修改属性名说明是否可修改Alterablestorage_schema存储表所在 schema默认使用物化视图自身的 schema否创建时固定storage_table存储表自定义名称未设置时按前缀与视图名自动生成否创建时固定stale_read_behavior视图过期数据超过容忍窗口时的读取行为可选FAIL报错或USE_VIEW_QUERY改查基表是staleness_window过期容忍时间窗口例如1h、30m、0s默认0s表示任何过期都触发配置行为是refresh_type刷新策略可选FULL全量重算或INCREMENTAL仅重算过期分区失败则回退全量是max_snapshots_per_refresh每次REFRESH每个基表最多消费的快照数上限0表示无上限需要 Iceberg V3 行谱系支持是use_timestamp_based_staleness对非 Iceberg 基表启用基于时间戳的过期检测接受true/false否从上表可以看出一个清晰的规律决定物理存储身份的属性storage_schema、storage_table在创建时固定、不可修改而影响读取行为、刷新策略与新鲜度追踪的属性stale_read_behavior、staleness_window、refresh_type、max_snapshots_per_refresh可以通过ALTER MATERIALIZED VIEW ... SET PROPERTIES动态调整。这正与文档中部分属性在创建时被固定的描述相互印证。例如将某个物化视图的过期读取策略调整为严格模式ALTER MATERIALIZED VIEW sales_summary SET PROPERTIES ( stale_read_behavior FAIL, staleness_window 30m );设置后当基表数据已更新且超过 30 分钟容忍窗口时对该物化视图的查询将直接报错直到执行REFRESH MATERIALIZED VIEW刷新数据为止。深入理解修改的属性如何影响查询行为要正确使用ALTER MATERIALIZED VIEW还需要理解物化视图的新鲜度staleness机制。在 admin/materialized-views.rst 中说明了相关背景物化视图不会在基表变化时自动刷新存储表保持不变直到显式执行REFRESH MATERIALIZED VIEWConnector 会向引擎报告物化视图的新鲜度状态引擎依据配置决定如何处理过期数据当视图过期且未设置视图级配置时引擎采用全局默认行为USE_VIEW_QUERY回退执行底层视图查询该默认值可通过配置属性materialized-view-stale-read-behavior或会话属性materialized_view_stale_read_behavior修改新实现下物化视图支持三种数据一致性模式USE_STITCHING拼接读取默认、FAIL过期即报错、USE_VIEW_QUERY直接查询基表。而ALTER MATERIALIZED VIEW正是按视图覆盖全局默认行为的手段通过给单个视图设置stale_read_behavior与staleness_window可以让不同视图采用不同的过期处理策略例如对报表视图严格报错、对普通视图静默回退查询。关于预编译predicate stitching、增量刷新、列等价column equivalence与暂不支持的模式如外连接、非确定性函数、TopN等详见 物化视图管理文档。总结与相关文档ALTER MATERIALIZED VIEW ... SET PROPERTIES是 Presto 物化视图体系中唯一的运行时属性调整入口。使用它需要牢记三个要点先开启新实现experimental.legacy-materialized-views false否则语句不被支持属性清单随 Connector 变化物理存储类属性创建即固定行为类属性可动态修改务必查阅所用 Connector 的文档遵守值约束不支持将属性设置为NULL未提及的属性保持不变。相关操作与概念可继续阅读仓库内以下文档CREATE MATERIALIZED VIEWDROP MATERIALIZED VIEWREFRESH MATERIALIZED VIEWSHOW CREATE MATERIALIZED VIEW物化视图管理含安全模式、过期处理、拼接读取与增量刷新配置属性参考【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表