热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【转】Kylin的Hierarchies,Derived维度方面配置优化

http:blog.csdn.netjiangshouzhuangarticledetails51286150Hierarchies:理论上对于N维度,我们可以进

http://blog.csdn.net/jiangshouzhuang/article/details/51286150

 

 

Hierarchies:

 

理论上对于N维度,我们可以进行2的N次方的维度组合。然而对于一些维度的组合来说,有时是没有必要的。例如,如果我们有三个维度:continent, country, city,在hierarchies中,最大的维度排在最前面。当使用下钻分析时,我们仅仅需要下面的三个维度的组合:
group by continent
group by continent, country
group by continent, country, city

在这个例子中,维度的组合从2的3次方共8种减少到了3种,这是一个很好的优化,同样适合YEAR,QUATER,MONTH,DATE等场景。

 

如果我们设置hierarchy作为H1,H2,H3,那么典型的场景应该是:
A. Hierarchies on lookup table
Fact table                                (joins)Lookup Table

column1,column2,,,,,, FK      PK,,H1,H2,H3,,,,

 

B. Hierarchies on fact table
Fact table
column1,column2,,,H1,H2,H3,,,,,,,

对于scenario A,这是一个特殊的案例,PK在lookup的表上,意外的成为了hierarchies的一部分。例如我们有一个日历的lookup表,cal_dt是PK(primary key):
A*. Hierarchies on lookup table over its primary key
Lookup Table(Calendar)
cal_dt(PK), week_beg_dt, month_beg_dt, quarter_beg_dt,,,

对于A*这种案例,你应该使用“Derived Columns”这种优化方案。

 

Derived Columns:
当一个或多个维度(必须是lookup表的维度,这些字段被称为“Derived”)能够从另一个中减少(通常是相关的FK,被称为“host column”),Derived column就可以被使用。
例如,假如我们有一个lookup的表,我们使用join关联fact表,并且使用“where DimA=DimX”。在Kylin中需要注意,如果你选择FK为一个维度,那么相关的PK将自动可查询的,没有任何额外的开销。这重要的原因是FK和PK总是相同的,Kylin能够首先在FK上使用filters/groupby,并且使用PK透明地替换。这个表明如果我们想用DimA(FK),DimX(PK),DimB,DimC在我们的Cube中,我们能够安全地仅仅选择DimA,DimB,DimC。
Fact table                             (joins)Lookup Table

column1,column2,,,,,,          DimA(FK)DimX(PK),,DimB, DimC

 

这里的维度DimA(维度代表FK/PK)有一个特殊的映射到DimB。
dimA dimB dimC
1 a ?
2 b ?
3 c ?
4 a ?
在这里案例中,给定一个DimA的值,DimB的值就确定了,因此我们说DimB能够从DimA获得(Derived)。当我们build一个cube包含DimA和DimB,我们能够简单的包含DimA,并且标记DimB作为Derived。Derived column(DimB)不会参与cuboids的生成:
original combinations: --原始维度组合

ABC,AB,AC,BC,A,B,C

 

combinations when driving B from A: --使用Derived优化后的维度组合

AC,A,C

 

在运行时,例如“select count(*) from fact_table inner join looup1 group by looup1 .dimB”的案例中,它期待从包含DimB的cuboid中去获取查询结果。然而,DimB因为使用了Derived优化,在cuboids没有结果。在这种情况下,我们修改执行计划,首先按照DimA(its host column)进行group by操作,我们将获取中间的结果,比如:
DimA count(*)
1 1
2 1
3 1
4 1
然后,Kylin将使用DimB的值替换DimA的值(因为他们的值都在lookup表中,Kylin能够加载整个lookup表到内存中并且build一个他们的映射关系),因而中间的结果为:
DimB count(*)
a 1
b 1
c 1
a 1
紧接着,运行SQL的引擎(calcite)将进一步的聚合中间结果为最终结果:
DimB count(*)
a 2
b 1
c 1
这个步骤发生在SQL查询运行期间,也就是“at the cost of extra runtime aggregation”。


推荐阅读
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
author-avatar
杜亮亮喜欢2602936263
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有