论文[1]提出SPJG查询改写,是SQL Server 2000视图改写的理论基础,高效实现基于selection, project, join, group-by算子匹配的视图改写方案,是当前很多计算引擎的物化视图查询改写的理论基础,例如:Calcite、Doris、StarRocks都基于优化器的SPJG结构改写进行扩展实现。
该论文主要贡献,提出:
列等价类:一组相互之间值相等的列集合,可基于等值连接获取,实现列引用重新路由是视图改写的重要能力。
基于列等价类理论,视图与查询源表相同的情况下,SPJ需要满足四个条件:
条件 | 解释 |
---|---|
1.行覆盖性 | CNF(合取范式)谓词拆分+蕴含校验:等值连接蕴含校验 + 范围蕴含校验 + 剩余蕴含校验 |
2.补偿谓词可用性 | 补偿谓词校验:等值连接补偿谓词、范围补偿谓词、剩余补偿谓词 |
3.输出表达式可计算性 | 输出表达式:常量表达式、简单列引用、其他表达式 |
4.行重复因子正确性 | 约束条件:非空约束、主键唯一键约束、显式/隐式的唯一性约束、外键约束 |
针对具有GroupBy聚合处理的SPJG,需额外判断:
基于SPJG论文的理论进行实现的,核心实现逻辑 MaterializedViewRule
,基于CBO选择代价最优的改写的计划树。基于perform
实现SPJG条件判断。
查询源表与视图源表的匹配类型:
匹配类型 | 表匹配情况 | 连接类型匹配情况 |
---|---|---|
COMPLETE | 物化视图和查询的表完全相同 | 物化视图和查询的连接类型相同 |
QUERY_PARTIAL | 查询的表比物化视图少 | 物化视图和查询的连接类型相同 |
VIEW_PARTIAL | 物化视图的表比查询少 | 物化视图和查询的连接类型相同 |
将查询和物化视图进行以下前置处理
MaterializedViewRule#isValidPlan
判断算子的类型:
MaterializedViewRule#splitPredicates
拆分两部分:PE列等价谓词 + PU剩余谓词;EquivalenceClasses
定义,是一组等值的列集合MaterializedViewRule#computeCompensationPredicates
MaterializedViewRule#generateEquivalenceClasses
,判断视图等值连接是查询等值连接的子集,当视图不同列等价类分别映射到同个查询列等价类时,则补偿视图列相等谓词。SubstitutionVisitor#splitFilter
获取视图的剩余补偿谓词。MaterializedViewRule#pushFilterToOriginalViewPlan
添加补偿谓词并更新视图计划树;MaterializedViewRule#rewriteView
视图重写,其中SPJ和SPJG有不同实现方式,SPJG要考虑视图上卷场景,处理更加复杂。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。