00:00
好,那接下来我们看第三一个优化点,就叫RO,叫做ROK的优化,这个RO当然指的就是h base当中咱们那个ROK了,对吧?现在还能回忆起来h base当中rie是什么样的吗?还能想起来不?想不起来了,这个忘了也太快了,上节课讲的,来,咱们看一下啊,那个肉会什么样的,看存储原理。这就是咱们的HPOK吧,对不对,那OK分为两部分啊,一部分呢,是Q报的ID,呃,这三个一指的是啥?是不是三个维度啊,对不对?那后面呢,指的是每个维度对应的维度值对吧?啊,那大有没有考虑过一个问题啊,我这三个一对不对?哎,确实是三个维度都有,那我第一个一指的是哪个维度?第二个一指的是哪个维度,第三个一又指的是哪个,有没有考虑这个问题啊,也就是说在RK当中,咱们这个维度的顺序大家有没有考虑过?那第一个是哪个为第二个是哪个,第三个是哪个,就是这个维德顺序有没有考虑过呀,没考虑对吧?啊,那现在咱们要讲的这个RO的优化,其实我们优化的就是啥呀。
01:04
就是这个维度在ROK当中的顺序。我们能优化的东西其实很有限啊,很有限,这个R的结构咱们是变不了的,它就是这个结构,固定的结构,我们能改变的只是啥呀,能改变的只是维度在ROK当中的前后顺序,咱能调的只有这个顺序能理解吧?啊,那接下来我们就看看这个调整顺序我们怎么去调啊,那调整顺序呢,我们其实两个思路,两个原则,哪两原则呢?第一个。被用作过滤的维度放在前边。这是第一个,那第二一个呢,基数大的维度放在基数小的维度前面。啊好,有这俩原则,那这俩原则呢,我们所优化的东西其实也是不一样的,这个原则优化的是我们的查询,这个原则呢,优化的是计算,啊那我们先看第一个吧,那什么叫做被用作过滤的维度放前面呢?啊,首先这个过滤什么时候过滤啊。
02:01
肯定是你构建完之后,你进行查询的时候过滤呗,对吧?好,那接下来我们看一个例子啊,通过这个PPT,咱们把这个理解一下,好,那大家来看一下这个东西,我这画的这个东西啊,它就是一个啥,就是一个Q最终计算完的结果啊,当然这个结果呢,存在h base当中,对吧,那我红色的字段就是。维度黄色的呢,就是咱们那个聚合值啊,黄色就是聚合值,那按理来说呀,咱们是不是这个h base当中那个ROK应该是怎么得到的,是不是应该是把这个维度字段我们给它进行编码,然后呢,前面再加上一个Q号的ID是组成它这个ROOK啊,对吧?但如果说我要那么写的话呢,这块大家就不好理解了,所以我要把这个RO给它还原了,就还原成咱们具体的字段了啊那具体字段了,然后大家还原之后呢,大家得注意观察,咱假如说这个AB就是ROK啊,AB拼上是不是就得到咱们ROOK了呀,对吧?那ROOK是按照什么排序的,按照字典顺序排序的,对不对啊,按字典排序的,那既然是按字典排序,你看我这是不是字典顺序?
03:00
你把AB看一个整体啊,字典顺序怎么排,是不是从第一个字符开始排啊,第一个相同比第二个,第二相同比三个,对吧,你看我这是不是。哎,第一个相同,哎11ABCD2后边的ABCD3没错吧啊自产顺序好,那现在我假如说我的需求是这样的啊。哎,咱们需求这样的,我们需求什么呀?是select AB some c,然后呢,From咱们这个原始表啊,原始表,然后呢,Group by字段,然后呢,咱们的过滤条件是啥呀?过滤条件是having b大于等于小b and b小等于小C,那咱们这个结果其实大家都知道,肯定会转成h base的查询语言,是不是从这张表里直接拿结果。对不对,直接拿结果,大家看一看啊,咱们这个结果在h base这张表当中是如何分布的。啊如何分布,其实这个C就是谁,就是咱们结果就已经是sum c了,对吧?啊也经sum c了啊也就是不是直接从这里边拿就行,那关键是拿哪些数据啊,是不是得拿那个B。
04:04
大于等于小于B,小于等于小C的对不对,应该是哪部分,是不是这部分没错吧,你看这个数据它在一块放着吗?没在一块放是不是分开存储的呀,对不对啊,那大家都知道我们HP你去查询数据的时候呢,两种方式,一种是get,一种是SKY。还记得吧,这个在讲HP的时候绝对讲了啊,就一个是get一个sc get是不是获取某一条数据,根据一个RO获取一行,那SC是不是根据一个rock的范围去扫描一部分数据啊,对不对,那你说咱们这这个查询方式肯定是哪种,肯定是SC呢,对吧,肯定SC,那SC这种查询方式什么时候效率是最高的?你是不是给他指明rockie范围,并且你要查的数据是存在一块儿的时候,你死干出来的效率是最高的呀,对不对啊,而且我们前面讲过,咱们ROK呢,设计的时,设计ROK的时候,咱们有一个原则啊,咱们设计RK有一个原则,什么原则?
05:00
就是将来你要一起查询的数据,你在写的时候要怎么办,给他写到一块对吧?啊,方便你后期查的时候一块一次性把它干出来嘛,对不对,那很显然他现在。是不是就违背了我们那个原则呀,对不对,我这是不是将来要一起查的数据,因为我后期我要按照必经过滤,这是我要一起查的结果呢,你没给我放一块儿,这是不是已经违背了那个rock黑的原则了呀,对不对,那所以说我们现在呢,就得把这个给他修改一下啊,得让他满足咱们那个原则,那这块你可以怎么修改呀。只需要调整一下咱们ROK当中的维度顺序就好了啊,怎么调,我是不是可以把B放前边,把A放后边,那完之后同样的这个需求啊,你看咱们数据是怎么分布的呢,这次。是不是在一块了,对吧,因为按照字典顺序排嘛,对不对,B相同的,哎,我我我把B放放前面,那B相同的是不是就在一块儿,哎,就这么求嘛,同样的一条这个词,那我这次再查我的数据呢,就分布在一块了,那现在就满足我们那个原则了,我将来要一起查询的数据呢,我写的时候呢,我就给它写在一块啊好,那这时候我们就得到一个结论啊,那咱们设计这个ROK的顺序的时候,怎么设计啊,是不是查询时被用作过滤的条件,谁是被过滤的条件呀,是不是A是不是B字段呀,那把B是不是就得放在前边啊,啊放前边是这样的,所谓放前边也就是什么,也就是你需要将咱们这个。
06:26
维度当中,我们这个第一个一,你得告诉他第一个一指的是谁呀。只是咱们那个B字段对不对啊,是这样的,你得搞清楚这个位置啊,这是我们的第一个原则,这个原则我们优化的很显然是查询吧,是不是查询的时候能够加快呀,对不对,这是第一个原则,好那这个完之后呢,我们再看第二个原则啊,第一个还是比较好理解的,但第二一个呢,相对来说就有点烧脑了啊,这个大家认真听,不要走神啊来,那第二原则是啥?基数大的维度放在基数小的维度前面,首先先明确它所优化的是计算,它能够减少计算量啊,优化的是计算而不是查询。好那现在我们来看一下这个基数的概念,基数概念前面刚刚刚提到了,对吧?那基数什么意思来着?
07:09
Count distinct,你对某一个字段进行count distinct的,你得到的结果就是这个字段的基数。能理解吧,那咱们这举一个具体的例子啊,比如说我这个时间维度表当中,我有月份,我有日,是不是有month,有day啊,对吧,那你说月份的基数是多少。12你对月进行抗in是不是就十二一二三四五六七八九十,十一十二一共12个月份嘛,那你对day进行抗的in呢多少?31呗,没没没错吧,那他俩谁基数大谁数小。月的基数小,那日的基数大,对吧,那咱们的原则是啥?基数大的放在基数小的前边,是不是应该把日放前边,月放后边,对不对啊,这就是他的一个原则啊,那为什么要这样去调整呢?那接下来咱们看一下啊,这也是有一个PPT。
08:00
好,那看这个PPT啊,刚才咱们提到了这个优化的是什么,是计算对不对,所以说我们得看它的计算过程,那计算过程咱们甭管是哪种算法,甭管是这个逐层构建还是快速构建,那咱们思想是一样的,都得先算最高维吧,最高维,然后逐次降维,那现在。我假如说一共有四个维度啊,四个维度我是不是已经把这样的最高维已经算出来了,ABCD4个维度是不是都有了,那四个一代表四维,没错吧,那接下来要进行降维,降维从四维是不是要得到三维啊,对不对,那到三维之后,你看我们应该有几个三维呢?C43应该有四个才对,对吧?但我这没有全写出来,我只写了两个,一个是ABC,一个是abd啊这个没错吧,能看懂吧?啊那假如我现在三维降完了,是不是得降到两维啊,降两降两降两维,比如我现在呢,降到这个两位的,咱们C42应该是有六个才对,对吧,就咱们那那五个不管,咱们就管这一个,就管AB,哎,是不是咱们需要得到它,那我问一下大家啊,它应该怎么得到,肯定从三维降降维而来,对吧。
09:02
那这个上边你看我要选择到AB,你说我怎么得到,我从它能不能得到。我从他能不能得到。也能,对不对啊,那关键是我到底从哪得,我是应该从它们俩其中的一个里边来聚合得到这个AB,还是应该把它们俩加一块,然后呢,聚合得到AB,你说应该是哪种啊。应该只拿一个,还是用用他俩聚合?加一块是吗?好好琢磨琢磨,应该是怎么办,一个就行,还是用俩。这个你得把这想明白啊,是用一个还是用俩。其实用一个就行了,用俩就不对了啊啊,为什么可能看这咱不好看出来看看哪个好看出来看咱们上午那个图,上午不是给大家画了一个方块嘛,对吧,咱们就看哪个方块。来,我把那个PPT找一下啊,呃,这个跑哪去了啊,在这呢啊,咱们打开就看这图弹空,这假如说这个就是我最高位的对不对啊,这个这是咱们那个最这个这个这个最低维的啊对不对?那现在假如说啊,我们想得到这个最低维的,那按理来说是不是应该从最高维,呃,从从它上一个维度得到啊,是不是从那降对吧?那咱们现在从头开始给它得一下啊,你看它是怎么一个过程,你要想得到它,你需要怎么做,是不是先拿到最高维,然后呢进行降维,比如说咱们先把时间这个维度去掉。
10:26
时间维度去掉,是不是得到它了,那你要再想得到地区,只需要怎么做就行,只需要把品类是不是再去掉,是不是就得到它了,那也就是说你想得到这个一维的,你从几个两维的聚合而来啊,是不是就从这一个两维的聚合而来,对不对?那同样的道理,你在这儿呢?想得到两维的是不是只需要从一个三维的聚合而来?而不是从这两个三维聚合来吧,啊,也是只需要从一个里边来就行了啊,这块稍微有点绕,大家一定要把这个搞清楚啊好,那咱们先把这搞清楚好,我只需要从一个的三维聚合二来就行了啊好,那接下来咱们继续分析啊,那既然从它们俩其中任意一个来是不是都行,他俩是不是都有AB啊,从谁来都行,那你说那你选的话,你应该选谁,怎么选?
11:09
啊,你不知道选谁啊,你就你就根据什么原则去选。因为从谁来都可以,对吧?啊,那你应该根据什么原则去选择。那肯定根据计算量啊,对吧,你就看一下这个数据集计算量,这个数据量少还是他数据量少,那谁小我是不是从谁而来啊,没错吧,哎,那他俩这个数据量大小是由谁来决定的呀。他俩是不是都有A,是不是都有B,对不对,所以AB你需要考虑吗?都有你就不需要考虑了,对不对,所以说它俩的这个数据量大小由谁来决定,应该是由C字段和D字段来决定的,对不对,那由C和D字段的什么来决定的呢?应该是由它的基数决定的。对不对,是不是要求它的基数决定的呀,对不对,那假如说我C的基数大,那基数大是不是就是你不同的值就多呀,你不同的值多,那你的数据量是不是就大。
12:05
啊,那D的基数基基基数小,那基数小你的不同的值就少,你的数据量肯定就少,没错吧?啊,那所以说呃,这两个数据集的这个数据量大小是由C和D的基数决定的,那所以说我们自己要选的话,你肯定得选一个什么样的,得选一个这个CD,哎,基数小的啊,那谁基数小我选谁对不对,那咱们得这么选,但是麒麟呢,他不是这么选的,麒麟咋选的呢?它的原则是这么选的啊,他会选一个q boy的ID,小的啊,他选一个q boy idqd是谁?这是是Q的ID啊对不对,那这个大小怎么比,就按照这个二进制的这个数字的比较规则去比,那这就是一个二进制的数字嘛。咱俩谁大谁小啊,显然左边大右边小,右边加个一是不是正好等于左边对不对,也就是说麒麟呢,选的是q Bo的ID小的啊,那既然他选他,那我们就得保证什么保证他选的是不是那个数据量少的呀,对不对,那怎么保证他选的数据量是少的呀。
13:08
那是不是就得让D的基数是小的,C的基数是大的,没错吧?啊,那这样一来的话,那咱们就得到一个这样的结论呢?什么结论呢?是不是应该是你得保证D的基数小,C的基数大。对不对,那也就是说这个结论。你为啥基数大的是不是在前边,基数小的在后边啊,对不对,哎,你得这么去,哎,这个理解才可以啊,那这样一来的话呢,咱们就能够,呃,进一步的就是加速它的计算了,哎,能够减少它的计算量,好,那这就是咱们的第二一个原则啊,第二个原则就是基数大的维度放在基数小的维度前面,好,这是俩原则,第一个原则我们优化的是查询,第二个原则优化的是计算。啊,稍微有点绕啊,稍微有点绕是吧,这个大家能理解,尽量的理解啊,因为你理解了是不是就真正的记住了呀,如果说实在是理解不了,没关系,就这么两行字,记住也行,对吧,背也能背过来呀,啊尽量的理解啊好,那这个讲完这俩原则之后呢,那这个东西咱咱到底怎么调啊,对吧,咱怎么调,在页面上调好,那咱们还是来到这个构建cube的第五步,Advance setting,然后你就接着往下拉,刚才是不是讲了聚合组了,那再往下呢,就是谁就是这个ROOK了啊就是ROOK了,那ROOK了,你看啊,这里边是不是咱们所有的维度对不对,它这个顺序其实已经有一个默认顺序了,对吧?他排第一,他排第二,他排第三对不对?那我现在假如想调整怎么调。
14:34
怎么调,你把鼠标指针指向你那个ID那个那个位置,哎,直接拖就行,哎,那这个顺序就调过来了啊,那调的时候呢,就按照我们刚才讲的那两个原则来进行调整就可以了,当然这个里边除了能调整顺序啊,其实我们还能调整其他的,这是啥,Encoding encoding就是啥意思?编码呀编码,咱们前面讲了,是不是会对维度字段进行编码处理,对不对,那编码的默认的算法是什么?是字典编码,你看这就啥。
15:04
字典那个单词叫做dictionary对吧,那D是不是就是那个相当于字典编码那个简写啊,对吧?当然这里边你也可以选择其他的编码方式啊,也可以选择其他的编码方式啊,是这样的啊,那这就是咱们这个RO的优化啊好,那到这一步呢,这个就完事了,我把视频录一下啊。
我来说两句