00:00
啊,各位同学,那接下来呢,我们看一下麒麟cube构建优化啊,那麒麟cube构建优化呢,在这儿一共有三个方面的内容,那分别是衍生维度啊,Derived dimension,诶这个derived dimension大家还有印象吧?还有没,我们昨天在讲这个麒麟的使用的过程当中,是不是有一步是构建cube,构建cube的时候是不是有一步是选择维度,对吧?选择维度的时候是不是有两种类型,一种是normal,一种是derive,对吧?OK,那这个就是我们所谓的衍生维度啊,那还有什么呢?还有下边这个是什么?是聚合组aggregation group,其实这个呢,我们昨天也看到了,可能有同学没注意到啊,那再往下呢,还有一个的优化啊,OK,那这个就是我们麒麟cube构建优化的三方面内容啊,OK啊,那在讲之前呢,我先给大家简单说一下啊,你说麒麟它这个优化啊,我们在优化的时候,你说主要有哪几个方面啊?啊,其实就主要两方面,第一个方面呢,我们优化的就是计算,那另一个方面呢,优化的就是查询,什么叫优化计算,优化计算是不是就是尽可能的加快它的计算速度对不对?查询呢,就是尽可能的加快它的查询速度啊,是这样的啊那我们刚才所讲的这个三方面呢?呃,既有优化计算的,也有优化查询的,诶我们一个一个看啊,我们现在先看第一个使用衍生维度啊,这个衍生维度呢,它优化的是什么呢?它优化的是计算,也就是它能够极大的加快这个计算速度,我这用了一个形容词叫极大,对吧?啊,它能够极大的加快计算速度,那为什么会加快这个计算速度呢?啊,它原理又是什么样的呢?诶此处呢有一些文字描述,这个文字描述呢,我们可以不看啊,可以不看,大家直接看我操作就行了啊,我先给大家演示一下啊,然后呢,让大家看一下效果啊来,那我们现在呢,就创建一个使用衍生维度的Q啊,那昨天咱是不是有一个model了,对吧,那在这边呢,我。
01:57
叫新建一个cube,咱们来看一下效果啊,选择对应的这个model玩下边呢,诶咱们起个名字叫做derived cube是不是就是衍生的cube呀,对吧?Word点下一步,那dimension呢,我这次跟昨天咱们第一个cube选一样的维度啊,当时是不是选了一个呃品牌对吧?呃,当然也选了一个gender,还有一个pro name的这个region name没有没有问题对吧,是不是这四个呀?啊然后要注意我后边这个类型是现在是不是都是用的默认的衍生维度对吧?那我点击OK啊,那么之后呢,点击下一步啊,然后呢,我这个度量值也是一样的,我跟之前都一模一样啊来继续往下走,那这块还是不变,下一步啊,那这个我的one塞ing还是先不动啊下一步啊,然后最后也不动,下一步最后呢,点击保存,点击yes啊,然后呢,大家来注意观察一下啊,那这两个Q吧,它们的维度以及度量值是不是一样的,对不对,那我们来看一下啊,这个衍生维度啊,跟我们下边这个,呃,就是普通的这个,呃,使用普。
02:57
中维度的这个CU有什么区别,咱们重点看哪呢?重点看一下这个点这。
03:03
来这个呢,我也点到这儿。来大家对比一下啊,那这个呢,是我们昨天创建的使用普通维度的Q吧,对吧?那它的qbo是几位二的四次方减一等于15,这是不是正常的对不对,但是你注意观察上面这个使用衍生维度的Q。它是不是只有七个这个boy呀,对吧?那你想一想啊,我的q boy变小了,那我的计算量是不是就会变小对不对,那相应的我的这个计算时间是不是就会变短呀,对吧?啊,那也就是衍生维度是不是确实是能够干什么呀,能够极大的加快这个计算速度的对吧?OK啊,那这就是衍生维度的一个效果啊OK,那它的原理是什么样的呢?哎,这个原理是什么样的呢?哎,那我们先来分析一下啊,你说为什么这儿它是七个,这个七是怎么来的。啊,有没有同学能想到七啊,如果说我参与计算的维度啊,要是三个,那是不是二的三次方减一等于七对不对,那也就是说是不是这个Q吧,他参与计算的维度可能就是三个呀,对吧?诶,那这到底是怎么回事呢?那接下来给大家解释一下啊,啊,那现在我们找到这个衍生维度的Q吧,啊完之后呢,我点一下这个艾,那咱们来到这个dimension这个位置啊来我给大家讲一下这个衍生维度的原理啊,那假如说啊,我们选择了某一个维度啊,并且这个维度的类型选用了衍生维度,OK啊,那最终参与到这个聚合计算的啊,就不是这个维度了,也是你选的这个衍生维度,它是不会参与到最终的计算当中的,那谁会参与到最终的计算当中的。
04:40
啊,就是你所选的这个衍生维度所在的啊,所在的什么所在的维度表的主见啊,会参与到最终的集团当中。啊,这个怎么理解啊,那也就是啥,我你比如说举个例子啊,这个不字段它是不是选的是衍生维度,那他会参与到最终计算里边吗?不会谁谁会哎,这个ID会啊,当然呢,真正参与到计算的其实也不是这个ID,而是谁呀,而是事实表当中与该维度关联的那个字段啊是这样,那也就是也就是这个SKD,那当然这个s sky ID跟我们下面那个维度表上的ID的值是一样的,对吧?是这样的啊,那也就是说我们最终总结一下啊,那如果说一个维度我们选用了衍生维度,那它是不会参与到这个最终的计算当中的,那到底是谁参与到最终的计算当中的,是事实表当中啊,与该维度啊关联的那个外界参与到最终的计算当中。
05:38
OK,是这样的啊好,那接下来我们来看一看啊,这个这个七个qbo到底是怎么来的,你比如说就咱们一个数啊,比如以他那这个表当中是不是有一个衍生维度对吧?那参与到最终计算当中的是谁?是不是这个事实表当中的SQID没错吧,接下来下一个那这个谁。这个真的不会参与到计算吧,是谁是这个ID,对对吧?当然也不是,这个ID应该是谁,应该是事实表当中的user ID,没错吧,然后再往下走,那这个维度,我这个维度表当中,我们是不是选了两个字段对吧?那他俩是不是都不会参与到最终的计算当中,那取而代之的是谁是事实表当中的pro ID,对对不对,那也就是最终参与到计算当中的维度啊,是不是就这三个对吧?那所以最终的结果呢,就是二的三次方减一等于等于几等于七,OK,这个七它就是这么来的啊,这就是衍生维度的原理。
06:28
OK啊,那大家想一想啊,这个衍生维度,那它嗯能能确实是能减少这个计算量对不对,但是它会不会带来什么其他的问题,计算量肯定是能减小的啊,计算速度肯定是能加快的,对吧?啊,那它会不会带来其他的什么问题?你想一想会不会?它肯定会带来其他的问题,为什么啊,你大家想一想啊,我们在这选的是不是这个维度,我选的是不是这个维度对不对,那我最终去查询的时候,我我是不是查的还是这几个维度啊,是这个道理吧,啊但是呢,他计算的时候,他并不是按照我选的这些维度去计算的,对不对,也就是说他最终得到的结果是我们想要的吗?
07:11
不是我们想要的对不对,那也就是说我们就不能直接得到我们想要的最终结果了,是这个道理吧?啊,那怎么办呢?那那是不是意味着我们在呃,后续查询的时候,我在发出查询请求之后,那麒麟还得再做一一步什么操作呀。是不是还再做一步聚合操作或者是转换操作,是这个道理吧,因为什么?因为它最终计算的结果并不包含你需要的这个什么TM name和GE的也不包含,你选的是什么pro name和name,它只包含谁,它只包含这几个什么ID,对不对啊,那你要想得到我最终我们想要的结果对不对?比如说我想知道每个品牌的销售总额,或者是啊什么每个省份的销售总额,那他还是怎么办?是不是还得把这些ID转成咱们相应的这个具体的维度啊,对吧,对不对?那转成具体的维度之后,可能会需要什么操作呢?
08:07
就可能会去做一个聚合操作啊,那这个操作是在什么时候做的,是不是在我们发出查询请求之后去做的呀,对吧?啊,那这样一来的话,是不是会影响到我们后续的查询呀,对吧?啊是这样的,这其实就是衍生维度它的一个呃原理啊,有优点也有缺点啊,是这样的啊,那当然我光这么说大家可能还是有点理解不了,没关系啊,我在这呢,为了方便大家理解,画了一个PPT,来咱们看一下这个PPT,看完这个PPT大家之后,呃,大家应该就都能理解了啊,我们来一起看一下啊,那首先我把这个PPT点开啊。来点一下。好,首先大家先来看一下这个位置啊,这是不是有两张表,一个表示事实表,一个表示维度表示对吧?啊,那这两张表它是通过哪个自动关联的,这是不是AID,这个是ID,它俩能够关联上对吧?啊,那这个C黄色的字段,这是属于是啥呀?是不是度量值对不对?那OKB和E这都属于什么?是不是属于维度属性啊对吧?OK啊,这是咱们的示数表和维度表,OK,那接下来看一下我们的需求是啥啊啊,那现在这个咱们先不用看啊,看后边诶那咱现在的需求呢,是分析count c和E之间的关系,Count c和E之间的关系啊,那你说你要想分析count c和E之间的关系,对吧?那我我再去选择我们的呃,这个维度啊,以及度量值的时候应应该怎么选。
09:30
选维度你得选谁维度你是不是得选E,是这个道理吧?那度量值是不是得看到C,是这个道理吧?啊,这是我们选择的啊,那假如说我现在选择E这个维度的时候,我选择不是那个normal格式,我选的是哪种,是derived啊,那你选择derive的是不是就是衍生维度对不对?那你选用衍生维度的时候,是它真正去计算的是谁?真正去计算的是这个AID吧?是E吗?不是E对不对?刚才说的是AID会代替这个E去进行相应的计算,OK,但你计算完之后得到的结果是不是应该是AID与count c之间的关系?是这个道理吧?OK啊,但是我们最终查询的时候,你肯定不会查AID跟count c之间的关系,你查的是谁?你查的肯定还是E跟count c之间的关系对不对,那所以说那我们在查的时候,他还还会做一步什么操作,是不是得替换一下对不对,那怎么替换,是不是得把AID替换成E,对不对,那你说AID怎么替换成一呀。
10:29
怎么换成是不是可以根据我这个维度表当中的这个映射关系,你想啊,那这这个AID是不是就是维度表当中的ID,对不对,我随便给你个ID,是不是肯定能找到一个与之对应的E,是是这个道理吧,啊,那其实这个从呃AID到这个E的这个关系呢,我们就叫什么关系啊。就是衍生关系嘛,啊,我是不是可以从这个ad衍生到这个具体的这个维度字段啊,对吧?啊,这个衍生维度,衍生维度其实就这么来的啊,就这个意思OK啊,那我根据这个衍生关系呢,我是不是就能够将AIB替换成一啊对吧?但是大家注意观察,注意观察啊,我直接替换完之后,这里边可能会出现什么样的问题。
11:09
你看啊,那一是不是替换成A,二替换成B对吧,三替换成C,四替换成A对不对,替换完之后你会发现有几个不有两个对不对啊,那我们这最终结果肯定应该有几个呀。肯定是一个呀,对吧?我要想分析count c跟E之间的关系,那肯定是啥?那是不是肯定是正常情况下就得按E分组啊,对吧?你按E分组是不是?呃,相同的这个E只能有一行对不对,这个显然是有问题的对不对?所以你你光替换还不行,替换完之后还得做一步什么操作,得做一步聚合操作,那这样一来才能得到咱们最终期望得到的结果,对吧?是这样的啊,那这就是衍生维度从前到后的原理啊,OK,那当然了,这部替换以及这个聚合操作是在我们呃发出查询请求之后去做的,对吧?啊,是这样的啊OK,那这衍生维度的原理大家应该都已经搞清楚了吧,对吧?啊,OK,那大家想一想啊,你说这个衍生维度哎,真的那么好用吗?好不好用啊?
12:06
其实从它的原理我就能看出来,它确实是能够加快咱们那个cube的构建,对不对,但是呢,它会是不是增加我们后续的查询的这个延迟啊,对吧?啊,它其实这个计算量它变了吗?计算量其实计算量并没有变,只不过呢,就是把什么呀,把查询之前的一部分计算量放到了查询之后,是这个道理吧,是这样的啊,那所以下边呢,有一句话咱们来看一下啊,他说什么,虽然衍生维度具有非常大的吸引力,这个吸引力确实非常大,为什么非常大啊,来咱们试想一下啊。来,那我还是以它为例啊,那假如说我这个维度表当中有十个维度字段啊,假如它有十个维度字段,如果这十个维度字段我们选用的都是啊,那你说应该会有多少个Q。是不二的十次方对不对啊,那如果说我全部都选为这个D的衍生为主,那按几个算呀,是不是按一个算是这个道理吧,这个二的一次跟二的十次是不是差了1000倍啊对吧?啊,这个呢,这个大家要稍微注意一下啊,差的还是比较多的啊,差的比较多的诶没有没有1000倍对吧?啊,是500多倍对吧?啊OK,咱们理解一下啊,OK,那这个呢,就是大家需要去注意的啊,也是确实能够极大的减少计算量啊,但是后边有但是对吧?但是前边的话都是废话对吧?咱们看后边的啊,但是这也并不是说所有维度上的所有维度表上的维度都得变成衍生维度啊,如果从维度表主键到某个维度,某个维度表维度所需要的聚合的工作量非常大,则不建议使用衍生维度啊,那这句话啊,他说什么,从主键到某个维度字段所需的聚合工作量非常大,这个聚合工作量指的是哪块,是不是指的就是这块,是是这个道理吧。
13:55
啊,聚合工量大,那我就呃不建议使用衍生维度,这个是不是很好理解对不对,因为这个聚合是在我们查询之后做的嘛,你聚合工作量大,那我的查询就会变得非常非常的慢,对吧?是这样的啊,诶那这个我怎么能知道它这个就是聚合的工作量是大还是不大呢?这个我怎么去判断呀。
14:13
这个怎么去判断,我将来这个聚合量大不大,你想啊,我们再去选择这些维度的时候,是不还没有开始计算呢,对不对,没开始计算,我怎么知道它的计算量大不大呀,这个怎么看?这个其实可以这样去看啊,我们可以根据什么呢?我们可以根据咱们这个,呃,数据的值的这个多少去判断啊,也就有一个词叫做基数啊,先把这个奇数的概念给大家,呃,这个普及一下,什么叫奇数,比如说我这儿呢,有一个字段啊,有一个列,这个列里边是不是正常情况会有很多的值啊,对吧?那我对这个列里边的值进行count distinct的统计,得到的结果就是这个字段的基数啊,也就是它有多少个不同的值,能理解吧?啊是这样的啊,我们可以根据这个基数去判断它的聚合工作量是否是比较大的,你比如说咱们这举个例子啊,咱们以它为。
15:04
就以他为例。大家看啊,那大家说你说真的这个字段到后期进行聚合的时候,工作量会不会比较大。会不会?会还是不会,好好想想啊,会不会,那肯定会比较大,为什么啊,你想啊,这个它聚合它,它如果说你这个选用衍生维度对不对,那OK,我这个参与阶段是谁是U段ID对不对,没错吧?啊,那U段ID我是不是可能会有很多,比如说咱讲举个例子啊,比如说我们有10万用户,那你这是不是就十万十十个W对吧,那真的呢,真的真的他的基数是多少。是不是就一男一女就是二啊,对吧,你从10万到二,你这个聚合量是不是非常大,也就是你需要把10万条数据聚合到两条,那你这个聚合工作量那就是大呗,对不对?那我再举个例子,别往下走啊,看哪看这咱们看pro内容,你就这个字段,它的聚合工作量大了。大不大,这个不大,为什么不大?你想想啊,Pro name跟这个pro ID它什么样的,是不是一一对应的对不对?ID我是不是有34个,那我pro name是不是也有34个对不对?那如果说pro name我选用衍生维度,那其实它最终要做的只是一个什么操作,只是一个替换操作,我只需要把ID替换成pro内容就行了,需要做聚合是不需要的,能理解吧?啊,那这样一来咱是不是就能够得到一个结论啊,什么结论啊,如果说我这个维度表主键的基数与对应的维度字段的基数差距小,那我的这个聚聚合的工作量是不是就小,对不对?如果这个主键的积分呃跟我这个维度的积分相差比较大,OK,那我这个呃,后期的聚合的工作量就比较大,是这个道理吧,OK啊,那在这儿呢,一般情况下你可以呃,有一个这样一个标准啊,什么叫大,什么叫小呢?如果说它俩相差十倍,OK啊,那这个相对来说就比较大了,这个。
16:59
聚合的工作量啊,那在十倍以下呢,相对来说就比较少啊,是这样的,当然这也是一个经验值啊,也是一个经验值OK啊,那再举个例子啊,你比如说他。
17:09
跟他,诶,你说这个聚合功能量大不大呀。这是34对吧,那咱们的region有几个region是地区,咱有几个地区啊。呃,具体比如说六个吧,假如说六个啊,六个六个或七个的,对吧,那这个是不是在十倍以内啊,对吧?啊,那说这个聚合的工作量也不算大啊,就这个意思啊,现在大家应该已经知道怎么去判断,呃,这个聚合的工作量到底大还是不大了吧?OK啊,这个就是衍生维度啊,那衍生维度呢,实际呃,在这个生产环当中呢?呃,怎么去判断到底用不用它啊,其实这样的啊,什么时候才用呢?如果说啊,我这个,因为咱们都知道这个离线计算是不是晚上进行对不对,如果说哎,我在第二天上班之前,比如说八点或九点之前,我能够完成相应的计算,如果能完成相应的计算,那你说我还需要使用衍生维度,是不是就不需要了,对吧?啊,我只要能保证第二天正常用,那我就不使用衍维度,为啥?因为你只要使用衍生维度了,肯定会影响到后续的产品呢,是这个道理吧,啊,那咱们集齐查询,集时查询最最重要的是啥?是不是得保证这个响应对吧,对不对啊啊OK,所以说我能够在八九点之前完成我这个计算任务。
18:19
那就不要用延伸维度,那除非什么啊,除非我这个计算量实在是太大了,对不对,实在算啊,我我可能我到第二天12点的时候才能算完,那这个肯定是不行的,那这种情况下啊,你就得可以考虑使用什么,是不是可以考虑使用衍生维度啊,对吧?那至少我先给他算完,算完之后呢,他查的慢一点就慢一点,对吧,就这个意思,所以这块呢,大家要理解一下啊OK,那也是这个衍生维度呢,大家需要酌情使用啊好,那我把视频停一下。
我来说两句