[ 
https://issues.apache.org/jira/browse/KYLIN-5309?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17684085#comment-17684085
 ] 

pengfei.zhan commented on KYLIN-5309:
-------------------------------------

h2. 1. 问题背景

在某客户使用 Kylin 的过程中碰到了两种情形可能不适合预计算的场景:

1)维表某些字段的值是动态变化的,而其它的字段不是;

2)表与表之间的关联关系是一对多(或多对多)的关系。

维表字段的数据值是变化的,而历史数据已经被构建到索引中是固化的,那么查询时就可能不是最新值,查询结果可能不准确甚至是完全不对的。要获取准确的查询结果,用户只有通过重刷索引才可以达到目的。如果已经构建好的索引历史数据是几个月甚至是十几年的聚合结果,每次维表变动都需要重刷,那构建资源开销是非常大的,此外,如果数据重刷期间有数据查询的需求,那么用户可能需要经历漫长的等待时间。

对于另外一个场景,多对多的关联关系会在 Kylin 预计算打平表时,表与表 join 
之后的数据量可能出现非常大幅度的增长,由此会引发构建时长会成倍的增加。当用户可使用的计算资源有限 
(事实上用户可使用的资源永远是有限的),这可能是难以令人接受的。

针对这两个场景,Kylin5 引入两个新特性来解决这两类问题。
h2. 2. 解决方案

针对维表某些字段的数据值随时间动态变化这一特性,在项目级别引入一个屏蔽设置的概念,它可以精细化管理到列级别,后面简称“屏蔽列”。这是另一种形式的不预计算。被屏蔽的列被设计成不预计算的,但如果用户在创建聚合组或者明细索引时仍将这些列定义成为维度,构建索引还是会使用这些维度、度量去构建索引。当这些屏蔽列被用户查询时,查询的结果可能是不准确的。

针对表与表之间的对多关联关系,在模型表的关联关系上定义一个新的属性 flattenable 来表示该维表是否预计算。如果该属性的值为 flatten 、空 或 
null,则表示该维表可以预计算;如果该属性值为 
normalized,则表示该维表不参与预计算。维表不参加预计算时,那么不会参与到打平表,索引因此也不会与这些维表之间存在直接联系。join 
的维表不参与预计算后面简称为“不预计算关联关系”。

以上两个解决方案可以看作是两种形式的不预计算,那么在不预计算的情况下如何保证查询可查呢?在预计算和实时查询之间寻找一个折中,借助于 Kylin 
的衍生维度查询来实现,也就是使用外键索引和快照关联后再计算得到最终的查询结果。
h3. 2.1 一些重要的概念

这边先介绍一些 Kylin5 相关的重要概念方便理解接下来的设计
 - 索引,对应于 Kyin5 版本之前的 Cube,分为聚合索引和明细索引。
 - 聚合索引,用来回答带聚合的查询。
 - 明细索引,类似于关系型数据库中的表,但 kylin 明细索引的数据可能来源于多张表 join 后的结果。
 - 多对多、一对多,与关系型数据库中的概念一致。
 - 可计算列,可以被预计算的表达式,不能含聚合函数。
 - 可计算列的显式查询,查询的 SQL 语句中直接使用可计算列对应的列名。
 - 可计算列的隐式查询,查询的 SQL 语句中使用可计算列的表达式。
 - 预计算,将查询需要检索的结果预先计算好,查询时能有效减少表与表之间的 join、聚合、分组等操作,能极大的提升查询性能。
 - 平表,表与表之间按照关联键 join 之后的一个结果集,这个结果集只包含了所有维度或者度量引用到的列。
 - 实时计算,传统的关系型数据库都是实时计算的,join、聚合、分组等耗时的操作都是在查询时实时计算。
 - 快照,kylin 为模型使用的维表创建的数据镜像。快照可在索引构建时自动生成,也可以开启配置后用户自主管理。
 - 带外键的索引,如果索引的维度中包含了外键列,那么这个索引就是带外键的索引。
 - 衍生维度,kylin5 的衍生维度与之前的版本不一样。在 Kylin5 中,如果被 join 
维表上的列没有被定义成维度,但在查询时使用带外键的索引与快照关联起来可以被查询到,那么它就是一个衍生维度。

h2. 3. 详细设计

解决方案中提到了两种形式的不预计算,屏蔽列和不预计算关联关系,接下来分别讲解。

h3. 3.1 屏蔽列

先以一个简单的例子引入屏蔽列的设计。假设用户的原始数据包括一张事实表和一张维表,如下图所示。


 

> Propose more flexible runtime join scenarios for Kylin
> ------------------------------------------------------
>
>                 Key: KYLIN-5309
>                 URL: https://issues.apache.org/jira/browse/KYLIN-5309
>             Project: Kylin
>          Issue Type: New Feature
>          Components: Metadata, Query Engine
>    Affects Versions: 5.0-alpha
>            Reporter: pengfei.zhan
>            Assignee: pengfei.zhan
>            Priority: Major
>             Fix For: 5.0-alpha
>
>
> At present, the kylin5 already provides a runtime join scenario: 
> non-pre-computation which can be defined when creating a model. Usually, 
> non-pre-computation is used for the scenario of many-to-many to avoid data 
> blowing up dramatically when building the flat table.
> This issue will propose one more flexible runtime join scenario for kylin5. 
> This feature is the excluded table.  More information will be introduced by 
> the Chinese document in the following comments.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to