资讯详情

Hazelcast SQL 的 CREATE VIEW / DROP VIEW 设计与实现:虚拟表、视图内联与依赖管理

📅 2026/10/8 8:11:42 | 华诺云谱 👁 阅读
Hazelcast SQL 的 CREATE VIEW / DROP VIEW 设计与实现:虚拟表、视图内联与依赖管理
缓存KV存储消息队列流处理后端【免费下载链接】hazelcastHazelcast is a unified real-time data platform combining stream processing with a fast data store, allowing customers to act instantly on>项目地址https://gitcode.com/gh_mirrors/ha/hazelcast点击查看免费下载导读本文以 Hazelcast 官方设计文档 docs/design/sql/13-create-drop-view.md 为核心系统讲解 Hazelcast SQL 引擎自 5.1 版本起引入的CREATE VIEW/DROP VIEW语句包括视图的存储方式、查询文本的规范化处理、视图在查询中的内联与优化器改写、惰性依赖管理策略、information_schema.views元数据以及配套的安全权限。读完本文你将掌握在 Hazelcast 中创建、替换、删除视图的完整语法与行为约束并能从源码层面理解视图在分布式 SQL 引擎中的生命周期。Background为什么要引入视图Hazelcast SQL 引擎长期缺少传统数据库中的“视图”概念。视图是一种虚拟表它本身不保存数据而是把一段SELECT查询的“结果集定义”命名后复用。引入CREATE VIEW/DROP VIEW是提升 Hazelcast 对 ANSI SQL 标准兼容性、丰富 SQL 能力的一步设计文档标注 Since: 5.1关联 Jira HZOLD-710设计状态 DONE。一句话概括视图的本质文档原文CREATE VIEW基于一条 SQL 语句的结果集创建虚拟表视图定义保存在一个内部 ReplicatedMap 中该 Map 的内容在集群所有成员之间复制之后被别名的查询即视图可以被内联到任何引用该视图的其他查询中。功能设计语法与语义CREATE VIEW文档提出的语法为CREATE [ OR REPLACE ] VIEW [ IF NOT EXISTS ] name AS query约束与语义query必须是SELECT语句OR REPLACE若同名视图已存在则替换否则命令失败IF NOT EXISTS若同名视图已存在则静默跳过与OR REPLACE互斥详见下文源码name为视图名视图与 MAPPING 共享命名空间不能与同名映射冲突。DROP VIEWDROP [ IF EXISTS ] VIEW name视图内联与查询优化视图是“宏展开”式的而不是物化的。文档给出了两个关键示例CREATE MAPPING m TYPE IMap OPTIONS (...); CREATE VIEW v AS SELECT * FROM m WHERE ...; SELECT * FROM v -- 等价变换为 SELECT * FROM (SELECT * FROM m WHERE ...);更有价值的是所有优化都按“视图已被内联进外层查询”来应用CREATE MAPPING m TYPE IMap OPTIONS (keyFormatint,valueFormatint); CREATE VIEW v AS SELECT * FROM m WHERE __key 20; SELECT * FROM v WHERE __key 10 -- 优化后变换为 SELECT * FROM m WHERE __key 10 AND __key 20;优化器会消除冗余投影外层投影与视图投影等价并把两个__key的范围条件合并为__key 10 AND __key 20。这意味着视图不会引入额外的执行开销最终下推到存储端的扫描谓词是合并后的完整过滤条件——视图在 Hazelcast 中本质上是一种“查询模板”。技术设计视图在 SQL 引擎中的实现视图的存储__sql.catalog ReplicatedMap文档明确指出SQL 引擎把目录对象catalog objects存放在__sql.catalogReplicatedMap 中。由于视图与映射共享命名空间把它们放在同一个 Map 中可以天然避免命名冲突。这里有一个重要的滚动升级约束__sql.catalog在滚动升级rolling upgrade期间也会被旧版本成员读取因此必须确保在集群整体升级到 5.1 之前任何视图都不被写入该 Map否则旧成员可能读到无法识别的目录对象。视图定义的对象模型从源码看视图在引擎中被建模为 View.javapublic class View implements Versioned, SqlCatalogObject { private String name; private String query; private ListString viewColumnNames; private ListQueryDataType viewColumnTypes; ... }View实现了Versioned接口用于滚动升级时的版本判断和SqlCatalogObject并通过SqlDataSerializerHook.VIEW参与 Hazelcast 的数据序列化writeData/readData中依次写入 name、query、列名列表、列类型列表因此它可以作为 ReplicatedMap 的值在成员间复制。注意其中的 Javadoc 警告如果视图依赖的对象发生变更viewColumnTypes可能过期直到视图被重建——这正是下文的“惰性依赖管理”策略在对象模型上的体现。视图定义的规范化处理视图“由查询文本定义”但查询文本并不是原样存储的。创建视图时引擎会校验查询合法性解析并解析其中的标识符identifiers和函数展开*投影。文档示例输入select * from m实际存储为SELECT column1, column2 FROM hazelcast.public.m即视图在创建时就被锚定到hazelcast.public模式下具体展开后的列名。因此如果创建视图时底层的表m不存在视图创建会直接失败创建期校验。语法解析与校验的源码实现视图语句的语法由 Calcite 语法生成器在 parserImpls.ftl 中定义SqlCreateView解析CREATE [OR REPLACE] VIEW [IF NOT EXISTS] name AS query其中query OrderedQueryOrExpr(ExprContext.ACCEPT_QUERY)保证必须是查询表达式SqlDropView解析DROP [IF EXISTS] VIEW name。对应的 AST 节点SqlCreateView.javavalidate()中首先检查OR REPLACE与IF NOT EXISTS不能同时出现orReplaceWithIfNotExistsNotSupported通过isCatalogObjectNameValid(name)校验视图名非法 schema 会报viewIncorrectSchema错误随后对query执行validator.validate(query)即创建期的完整校验。SqlDropView.java对应DROP VIEW同样校验名称合法性。这些行为在 CreateViewStatementTest.java 中有完整覆盖包括正常创建、带OR REPLACE创建、同名视图重复创建失败、REPLACE与IF NOT EXISTS混用报错、与同名 Mapping 冲突报错、非法查询失败、DROP VIEW成功、使用全限定名fully qualified name以及错误 schema 失败等场景。可配合 HazelcastSqlParserTest.java 查看语法级测试。依赖管理为什么选择“惰性”方案视图几乎总是依赖其他视图或映射传统 SQL 数据库会严格追踪这些依赖关系例如视图a依赖表b则不允许直接删除b只有配合CASCADE选项时才原子性地连同a一起删除。此外任何会改变视图输出的对依赖对象的修改如删除视图引用的列也被禁止。文档示例CREATE MAPPING m (col1 INT, col2 INT) ...; CREATE VIEW v AS SELECT col1 FROM m; -- col1 将被移除由于 v 依赖它该操作不被允许 CREATE OR REPLACE MAPPING m (col2 INT) ...;设计文档权衡了两种方案严格依赖管理Strict dependency management由于缺少事务支持需要借助分布式锁这会大幅限制并行度对 DDL 尚可接受且必须正确处理成员失败时锁的持有、部分变更的回滚/完成等问题——实现复杂度高。惰性依赖管理Lazy dependency management仅在创建视图时校验一次查询之后对依赖对象的任何修改都允许当视图被再次使用时重新校验查询。Hazelcast 最终选择了惰性依赖管理理由有三引擎已有先例SQL 作业SQL jobs同样依赖映射但作业运行期间仍允许修改映射且这些修改不会影响正在运行的作业SQL 引擎还依赖大量外部对象如外部数据源无法严格控制其依赖外部对象被删除后映射会“断裂”只需在下次使用该映射时检测即可与View对象模型中“列类型信息可能过期”的注释完全自洽采用惰性方案后SELECT * FROM v在依赖列被删除时会失败因为查询在使用时重新校验。information_schema.views 元数据引擎提供了标准的information_schema.views视图向用户暴露视图元数据其实现见 ViewsTable.java列定义与设计文档一致列名类型说明table_catalogVARCHAR目录名table_schemaVARCHARschema 名即 mappings schematable_nameVARCHAR视图名view_definitionVARCHAR视图的规范化查询文本check_optionVARCHAR默认 NONE当前未使用is_updatableVARCHAR默认 NOinsertable_intoVARCHAR默认 NO按 ANSI 标准check_option、is_updatable、insertable_into三列在实现中被固定为 NONE / NO源码注释注明它们目前未使用。文档还指出information_schema.columns中已有视图的列信息若采用严格依赖管理可直接在目录中保存列清单而惰性校验方案则需要在查询columns视图时动态校验所有视图以生成列清单。安全CREATE_VIEW / DROP_VIEW 权限视图引入了两个新的权限动作与既有的CREATE_MAPPING/DROP_MAPPING形成互补数据库中对不同 schema 对象分别设置权限的惯用模式ActionConstants.java 中定义动作字符串ACTION_CREATE_VIEW create-view、ACTION_DROP_VIEW drop-viewSqlPermission.java 中为CREATE_VIEW、DROP_VIEW分配独立的权限位掩码并将其并入ALL掩码与CREATE_MAPPING、DROP_MAPPING、CREATE_INDEX、CREATE_TYPE等并列。也就是说在 Hazelcast 的权限配置中可以通过给成员/用户授予create-view、drop-view动作来控制 DDL 权限边界。使用小结与注意事项把文档与源码对照可以得到一组实战要点创建视图CREATE VIEW v AS SELECT ... FROM m WHERE ...;视图查询必须是SELECT创建时即完成校验与*展开底层表不存在则报错替换/幂等CREATE OR REPLACE VIEW用于覆盖已有同名视图CREATE VIEW IF NOT EXISTS用于幂等创建两者不可混用命名空间视图与映射共享命名空间同名冲突会导致创建失败删除DROP VIEW [IF EXISTS] name依赖是惰性的修改视图依赖的映射如删列会被允许但之后使用该视图的查询会因重新校验而失败——使用视图前最好确认底层对象仍在且列未变性能视图是纯内联/展开语义不产生额外执行节点谓词和投影会被优化器合并下推升级注意视图是 5.1 引入的目录对象滚动升级到 5.1 之前不要创建视图权限需要create-view/drop-view权限可在安全配置中按需授予。设计文档的测试标准是“单元测试与 soak 测试足够”目前视图语句的语义、解析与边界行为已在 CreateViewStatementTest.java 等测试类中落地验证可作为深入阅读引擎实现的入口。赞分享缓存KV存储消息队列流处理后端【免费下载链接】hazelcastHazelcast is a unified real-time data platform combining stream processing with a fast data store, allowing customers to act instantly on>项目地址https://gitcode.com/gh_mirrors/ha/hazelcast点击查看免费下载相关推荐TiDB 视图VIEW功能的设计与实现从元数据建模到 SQL 查询展开TiDB 视图VIEW功能的设计与实现从元数据建模到 SQL 查询展开 本指南以 View Support 设计提案 https://link.gitco数据库分布式数据库后端OLAPStarRocks CREATE VIEW 详解逻辑视图创建、安全视图SECURITY与源码级实现原理StarRocks CREATE VIEW 详解逻辑视图创建、安全视图SECURITY与源码级实现原理 CREATE VIEW 是 StarRocks 中数据库OLAP数据仓库大数据湖仓一体数据分析MikroORM View Entities 完全指南从 CREATE VIEW 到物化视图的实战详解MikroORM View Entities 完全指南从 CREATE VIEW 到物化视图的实战详解 导读 视图实体View Entity是 Mikro后端上一篇Bootstrap Icons 图标详解file-earmark-post-fill文件文章图标下一篇实测这枚开源AI音频处理插件5项AI能力全本地运行3分钟上手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑