00:00
OK,那我们来看一下这个,呃,RO的这个优化,看一下RO的优化啊,那这个RO的优化是什么啊?呃,所谓的RO肯定是h base的R,那h base的ROK设计是不是呃,通过Q报的ID加上那个维度值来进行这个组合而成的呀,组合成的那这个东西呢?他这个我们这个设计的这个模式是这样的,那我们是不能改的,对不对,我们优化是优化不了它这个结构的。但是我们能优化什么东西呢?我们能优化的是诶维度的顺序。我们能优化的是维度的顺序,这个所谓的维度顺序是什么样的呢?看一看啊,我们前面只讲了我这个有一个Q报的ID,那Q报ID如果说四个一全是一,那就说明我是所有维度都有的,对不对?但是咱们并不知道你第一个一指代的是哪个维度,第二个一指代是哪个维度,咱们并不知道那个事儿对不对,那其实我们这儿它是有一个默认的顺序的,有一个默认顺序,然后我们能干什么呢?我们能优化的点就是我可以去调整这个维度的前后顺序。
01:03
我能去调整这个东西,别的咱管不了,只能调整它,那我们调整这个,呃维度顺序的时候,我们的原则是什么呢?咱们的原则这样的一个原则,呃是什么?是被用作where过滤条件的维度放在前边。也就是说你构建完这个cub之后啊,那后续我进行查询的时候,我可能会以某一个维度作为这个VR过滤条件,那这时候呢,你就需要把这个VR物理条件的维度呢,放在你这个R的最前面,放最前面,这是一个原则,那原为什么这样,那一会看原理啊,咱们一会再看,那下来我们看谁看这个下边。下边是这个,呃,基数大的维度放在基数小的维度前边,首先啊,先明确一下什么叫做基数。什么叫基数啊,什么叫基数,所谓的基数呢,其实就是你这个维度,呃,那个字典表的那个,呃,那个长度维度字典表的长度啊,说白了就是呃,比如说咱举一个例子吧,咱们比如说我这有一个月份的维度,一个月份的维度。
02:03
那月份的维度,你想我们这个月只能有什么,一月二月三月四月五月六月七月八月九月十月11月12月对不对,那也就是说月份的这个基数呢,其实就是多少,就是12。对吧,那日的的维度是多少啊,那31呗,对不对,那其实说白了就是对这个维度的一个count distinct,这样得到的一个结果,其实也是它那个字典表的长度。就是一共诶到多少,那个自然值最大到多少,就是这个所谓的基数啊,它那原则是什么呢?原子是基数大的维度,放在基数小的维度前面。这是这俩原则,好,那我们现在逐一看一看这俩原则它到底有什么道理,先看第一个。大家来看一下,那现在这个东西呢,就是我们最终在h base当中我们存的一个结果,这就是在h base当中存的一个结果啊,H base里存的一个结果,那既然是这样的话,我们来看看我们前面A和B是什么,A和B是这个维度。A和B是维度啊,AB是维度,那C呢,是最终的这个count的那个聚合值,聚合值那大家都知道我们在h base当中其实存的不是具体的值,那存的是什么?是那个维度,维度的那个那个那个value对吧,是那个数字对吧?但是我这如果写数字的话呢,大家可能看起来那个比较比较比较比较那个不清晰,就是不是那么明显,左手这呢,又把它还原成了咱们具体的这个维度值了。
03:22
又还原成具体位置啊,但是实际上你写维度值跟我写这个呃数字,那其实啊,它这个顺序是是一样的,顺序是一样的啊,因为我们在这个h base当中,我们存是按照什么存的,我们是按照这个字典顺序存的,对不对,按字典顺序存,那按照字典顺序存,也就是说我需要是不是先比较前面的维度,再比较这个后边的维度呀,咱是这么去比较的,那我们来看一看它这边是怎么去比的啊,我们来简单来看一下,先看一下这个,先看一下什么,先看一下这个第一个维度,这个A,然后看这个,呃,再看B啊,那A这边呢是什么?一是数字一,然后B,呃,B呢,B是什么?B是这个是字母,那字典顺序先比第一个,再比第二个,那最终得到的顺序是不是应应该是这样的,1A1CE2A2B2C2呃2D,对吧?应该是先比前边后比后边。
04:12
对吧,是这样的,那呃,我们接下来看看我们有什么样的需求啊,我网上的需求,我的需求是什么呢?就是这个需要去把咱们这里边的数据查出来,查的时候呢,我的过滤条件是什么?是这个呃,B大于等于小B,然后B小于等于小C。那B这个字段对不对?大于等于小B,然后小于等于小C,那也就是说我需要的数据应该是分怎么分布的,应该是这么分布的。实上是这部分数据我要查出来呀,那你想一想,你要查这部分数据,呃,你想一想啊,咱们最终我数据要去哪查,是不是要去h base h base里查,那很显然,咱们去h base里查数据的时候,我们应该用哪种查数据的方式啊?HS2种方式,一种是get,一种是SC,对不对,那很显然咱是不是应该是SC,那SC我们什么时候干的时候效率是最高的,什么时候效率最高的就是你要查询的这个数据啊,如果说在h base当中,我是连着的,我是放在一起的,那这时候我查询的时候,我这个死干是不是效率才是最高的呀?
05:10
对不对,那其实我们HS使用有一个这样的原则,就是我们去设计K的时候呢,我们有一个这样的原则,什么原则呢。这样的原则就是说什么呀,就是你后期诶,要一起查的数据,尽可能给他在写的时候放到一块。这个原则记住啊,就是说你设计HOK的时候一个原则就是诶你后期要一起查询的数据,诶尽可能保证他写的时候能写到一起,能连着写,诶这是我们设计OK的一个原则,那这样一来我们就得想想想什么呀,想办法把咱们这个数据是不是让它分布在一起啊,那怎么让它分布在一起呢?我们只需要把这个两个诶肉两个这个维度的顺序给它调整一下就可以了。调整下就可以了,怎么去调整看,那我现在把B放前边,B是不是外过滤条件,那我是不是给它放前面,放前面之后我再去查这个数据的时候呢,那你看咱们的数据是不是就连连在一起了呀。
06:06
诶,那因为B在前边嘛,你先按照B排序对不对,那这就是咱们这个所谓的这个第一个原则就是诶被用作诶过滤条件的维度,咱们放在前边目的是什么?目的是我查的时候呢,能够更快一些,咱们用死干去查这种连续数据的时候呢,是是最快的是最快的啊OK,那其实这块大家也能想到,那如果说这个数据分开,分开之后,那是不是很有可能我这些数据根本都不在一个region里边,是不是都是有可能的呀?哎,对不对,那所以说你你还有可能去去去便利多个region,那这边我如果说数据都挨着的话呢,那我查询效率肯定是要比分开要高很多。这是咱们第一个原则,其实这个原则呢,还是比较好理解的,那接下来咱们看第二个原则啊,第二原则可能相对来说就呃,就稍微的麻烦一些了啊,我们来看一看这个基数大的维度,放在基数小的维度前边,首先还是先明确什么叫基数啊,就是那个所谓的维度的count distinct的值的大小,好,那现在往下看。
07:03
下边呢,是这个它的原理,它的原理啊,那我们一起来看看这个所谓的原理是什么。那我们来说一下啊,我们刚才那个rock的原则呢,就是第一个原则,那是针对什么去优化,是针对我后期查询去优化的吧,你要那么设计后期我查的时候我会诶更更快一些对不对,那这个呢,这个这个原则,第二个原则是针对谁呢?是针对咱们这个构建的时候,诶这个进行优化的。那也就是我这么去来设计这个OK的话呢,那我构建的时候,我计算的时候会更好一些,来,我们看它是怎么个原理来。那构建的时候,我们回忆一下我们构建算法啊,咱们两种,一个是呃,逐层构建,一个是这个快速构建,对不对,那甭管哪种构建方式,甭管哪种构建方式,我们的原则都是什么,都是先把最高位算出来,然后再依次进行降维,对不对,这是我们的原则,那这边咱就不管它是什么方式了啊,那我们就继续往下走来,那我现在已经把最高位算出来了,那接下来我算这个,呃,第一维的降维,那降维的时候,咱们最高是四个维度,那三个维度的应该有几个,应该有C43应该有,应该有四个才对,对不对,那我这边呢,我我就没有全画出来,我只画了俩。
08:12
一个是110,一个是1101,我只画了他们两个,那现在大家往往下思考啊,那两维的我算完之后,接下来要干什么?接下来要算三维的,接下来,呃,不是两三维的算完了,接下来算什么?要算两维的,对不对?两维怎么来,从三维而来。那现在比如说我现在要要得到一个这样的维度。这个1101只有A只有B,这边只有B,那你琢磨琢磨,你说诶,它应该由谁将将来。他应该由谁而来?应该是由由他来来行不行。是不是可以,我从这是不是把这个一给它去掉,我是不是就能得到这个。能得到吧,应该是没问题的,那咱们从这降能不能得到,也能得到啊,我是不是把这个最后一个维度给它去掉,是不是也能得到它,对吧,那也就是说咱们现在这个两维的呀,我实际上从他哎或者是从他那我都是能来的。
09:08
都能拿到,都能拿这个值,那我现在这个可能就比较麻烦了,我就得琢磨琢磨了,诶我到底应该从哪儿来呢。到底应该从哪来呢?其实按照我们自己的想法怎么来,是不是哪边数据量少,我从哪边来是比较合适的呀?对不对,因为你数据量少,那说明我这个计算的时候呢,我会干什么,我这个数据量就就就就小嘛,就计算的就快,对不对,这肯定是我们的想法,那麒麟是怎么去做的呢?看一下我们麒麟的原则是这样的,他选择的是那个q boy的ID比较小的。Q boy的ID比较小的,什么叫Q报ID比较小呢?大家看一下啊,我们的Q报的ID呢,实际上你可以把它当成一个二进制的一个数字,一个二进制的一个数,对吧?那比较大小呢,所谓这个大小就是按照这个二进制的比较规则去比较的,那这个跟这个谁大呀?很显然是不是右边这个是小的呀,对吧,右边这个是不是加个一,我才能得到这个左边这个呀。
10:03
是这样的啊,那他选的实际上就是一个Q的ID小的,那既然是这样的话,你说我们就得保证什么,我就得保证啊,是不是他选的这个那个数据量是比较小的呀,对不对,我觉得保证他选的那个数据量是比较小的。这个应该能理解是吧,那咱们如何去保证这个数据量小,那这个数据量大呢。怎么去保证这个事儿呢?你其实你可以,你可以想一想啊,就是说咱们把数据聚合到这个这个力度之后,那你想一想,你说这两边他们俩的数据量大小,其实是由由谁来说了算的。跟AB有关系吗?跟AB其实没关系,因为它俩相同嘛,相同的话我就可以不考虑这个因素了,我就可以把它排除掉了,那是不是也就是说决定因素就是C和呀,对不对,那这两边数据量的大小是由C和D的什么来决定呢?那是不是很显然是由它的基数来决定的?对不对,也就是看count第四个值由它来决定的,那也就是说咱们这就找到这个我们的这个一个一个原理了,什么原理啊,来往下看,那假如说我这诶。
11:08
假如说我这边的基数小,那这边的基数大,那是不是就能够让我们麒麟去选那个数据量比较小的呗,对不对,我这边D的基数是三,那这边基数是六对不对,可能我这边选的,诶,那就能够选择这个小的数据了。那就是这样,那也就是说咱们得保证什么呀,是D的基数要比C的基数是不是要要什么要要小才对吧,对不对,D的基数要比C的基数小,那也就是说谁呀,也就是说后边的基数是不是应该比前面的这个基数小。对吧,那也就是说最终就推到了我们这个最终的原理,什么原理,就是说基数大的维度要在前边,基数小的呢,我要在后边。这就是咱们这个这个原理,就是这个原理,那这个原理呢,大家就是说可能理解起来稍微的那个费点劲,但是这个东西呢,你要实在是不好理解,不好理解怎么办,那你把这个结论记住就行了,对吧,这个结论结论应该能记住吧,基数大的维度向前调,然后基数小的维度呢,我向后调。
12:06
就是这样的一个东西啊,呃,OK,那这个咱们就说完了啊,好,那我把这个呃说完之后呢,呃还不能录视频,还得干什么,还得告诉大家一下,如果到底怎么去调这个数,这个顺序啊,对吧,你光讲原理不知道怎么调也不行,怎么调诶,同样是在页面上调他这个麒麟,其实使用起来这个这个web UI呢,还是非常不错的,非常好用,那怎么去调整呢?来还是咱们在设计cube的时候去进行调整啊,然后点击N,然后点击N,点击这个N,还是在这个位置advance setting,刚才是不是在这设置了聚合组啊,那你往下拉,往下拉就是这个了。R,那下边呢,就是这边你那几个维度,你要想调整顺序怎么样呢?这是它的默认顺序,想调整顺序怎么办?诶把这个光标指向这个数字变成十字的时候呢,可以诶拖动,那这样一来你就把它调上面去了,那我把这个再往上调,诶是可以这样去调整的,那这个调完之后呢,它就按照你这个顺序来了,它这有一个默认顺序的啊好,那到现在为止呢,呃,我们这个这个所谓的这个呃呃,RK的调整呢,咱们就说完了,这个视频我录一下啊。
我来说两句