00:00
我们看这个麒麟cube构建的优化啊,那其实cube构建的优化呢,你看啊,咱们这儿有四个小节对不对,那其实这四个小节呢,我们呃去讲这个优化的时候呢,我们都可以分为这样的两个优化方向啊,那优化的方向分别是什么呢?第一个优化的就是计算,那第二一个呢,优化的就是查询啊,计算就是让他计算加快一点呗,算的更快一点,计算量更少一些,那查询呢,是不是就是加快咱们查询速度啊,对不对,就是这俩方向啊啊,那接下来我们一个一个看啊,先看第一个衍生维度叫做derive的dimension啊先来给大家明确一点,这个衍生维度的呢,它优化的是谁?优化的是计算,衍生维度呢,它能够极大的降低我们这个QB构建的时候的这个计算量,能够极大的降低这个计算量啊,啊是不是听着挺诱人的,感觉还挺厉害对吧?啊,那这个延伸维度大家还有印象吗。Derived这个这个字眼应该之前看过吧,我们在干什么的时候选过它是不是构建咱们那个cube的时候,在选维度字段的时候,是不是有两个类型啊,一个是normal,一个是derived,对不对?那现在要讲的这个derived就是当时见到的那个东西啊好,那刚才也说了,Derived能够极大的降低计算量,那现在呢,我可以先给大家演示一下这个衍生维度的效果啊,完了之后呢,再说这个衍生维度的原理,来咱们看一个效果,咱们看效果呢,我们可以来到这个麒麟的首页点model,那这时候我们可以再建一个Q吧,啊,咱们新建一个啊,来我点击这个new.q吧,完之后呢,我们还是选择之前的model,然后名字呢,咱们换一个,换一个咱们这次叫什么叫做derived q吧,也一会儿我再选维度,我是不是都选衍生啊,对吧,来咱们下一步。
01:41
加dimension还选跟之前一样的维度啊,之前有一个真的是不是这有俩东西,我说下边呢,还有一个什么TM name对吧,咱是不是选了这样的四个字段,跟之前一样吧,然后这次类型我全写的衍生看到了是吧,那接下来咱们点击OK。Derive的啊,然后下一步那度量值呢,跟之前一模一样,咱们只只有一个地方不同啊,就保持那个衍生维度那不同,别的都一样,然后下一步啊,这块不变,这块咱们也不变,下一步这块呢,还是N。
02:11
啊C保存。好,那现在是不是俩俩俩cube了对吧,那这个cube的我就不建,就不让他去构建了啊,我们看一下是谁,看一下它那个planner看他。来,你这时候注意观察。你会发现他的这个qbo的是不是只有七个了呀,对不对,那咱们选了几个维度,四个维度,但他最终要计算的qbo的呢?呃,只有几个,只有七个,那四个本来应该是几四,本来应该是15,对吧?那你看我们选普通的那个是不是就是15个,那这个呢,只需要计算七个啊,这个七是怎么来的啊,你先不用管它怎么来的啊,先不用管你现在是不是已经看到了,我的这个计算量已经明显的下来了,对吧,那个15这个是七啊,那这个是怎么减少的呢?这个七怎么来的呀?为什么是七个q boy?
03:02
哎,有同学发现了,是不是少了一个维度啊,好像是对吧,你要是四个维,二的四次方减一等于几十五,那三维的如果是三维是不是二的三次方减一等于七,好像它这算的是不是按三个维度算的对吧?那这个到底怎么回事呢?来给大家解释一下啊,那现在呢,我们还是打开之前构建的这个,呃,衍生维度啊,咱们找哪找到这个action,点击ID,我们来到这个dimension这个位置啊,哎,咱们这儿呢,选的是不是都是衍生维度啊,然后给大家说一下啊,这个衍生维度它底层是什么样的逻辑啊,认真听同学们。这个衍生维度有这样的特点啊,只要你在维度表当中所选的这个维度的类型是derive的类型,是衍生类型。啊,那OK,真正参与计算的一会儿是不是要构建呀,对吧,真正参与构建参与计算的其实并不是你所选的维度。啊,你只要选了衍生了,那这个实际上并没有参与真正的计算,那参与计算到底是谁呢。
04:05
是谁呀?是以衍生维度所在的维度表的。主见。啊,或者是谁呀,或者是你这个主键在事实表当中所对应的那个外键。就是这么回事啊,那所以说这边到底咋回事,咱们看一下啊,你看这个位置,这张是维维度表,咱们选的是不是衍生维度,那它真正参与构建了吗?没有谁谁谁参与构建了,是不是它的主建啊,或者是谁,或者就是在那个师表当中外建其实是外建啊,但其实主外键应该他俩是相同的吧,对不对,其实那个外建啊,这个是哪张表SKU引份对吧?那就是参与构建的应该是谁SKUID。啊,那接下来下边那这张表base province,那这张表我是不是有两个维度字段呀,那两个维段他俩是不是都没有参与,那取而代之的是谁呀,取而代之的是谁是这个ID或者是谁,或者是上面那个pro ID啊,那这张表咱们也是衍生维度对不对?那所以他应该是谁?应该是user ID,所以说那咱们这个Q吧,最终参与构建的实际上只有谁呀,是不是只有这样的三个外键呀,对不对,三个外键那是不是就是二的三次方减一等于七。
05:20
对不对,那个七它就是这么来的。就是这么来的啊。好,那这个大家来再跟我继续思考一下啊,那假如说啊,我在这个,你比如说在这儿。我在这张维度表当中啊,咱们只选了一个维度,对不对,假如说我把这几个维度都选上了。选了,而且都是衍生维度,那本来我参与构建的维度应该有几个?二十五次方吧。对不对,但结果呢?你要都是衍生维度。是不是只有一个了,那这一下就差了30倍吧,对不对,一下就差了30倍啊啊,那所以说这个衍生维度是不是能够减极大的减少咱们这个计算量啊,确实是这样的啊,但是这个好用啊,大家觉得。
06:06
没有你想的那么好用,为什么啊,你想一想啊,虽然我进行计算的时候,我这个计算量确实下降了啊,啊为什么下降,因为它是根据你这个外建去构建的。咱们后期你想一想啊,我建cube的时候,我是不是选的这几个字段对不对,那你后期你查询的时候呢。你查询是不是还得按照你选的字段去查呀,对吧,我后期我去分组的时候,我是不是还得按照pro name分组,按照region name分组,我不会按照这个ID去分组的吧,对不对,那所以说你最终还得怎么做呀。是不是最终你还得把那个CU吧,这就你构建完cube这边该是以他们仨构建的呀,对不对,那你构建出来这个cub呀,其实它就已经不是你最终的那个结果了啊,它已经不是咱们后续查询的时候需要的那个直接的结果了,对不对,你还得怎么做呀,你还是是不是得还得想办法,比如说我得把province ID你还得转化成谁装成谁呀。
07:04
问,谁是不是还得转化成咱们的这个省份名称或者是region的名称,对不对,是不是还得做一部转化呀,对不对啊,除了做这步转化之外呢,你甚至还得再做什么呢?还得再做一部聚合。再做一步聚合。啊,为什么还要再做一步聚合呢?啊为什么呀?哎,你思考一下啊,咱们这可能说省份说明这儿不太好理解,咱们说哪呢,咱们说这个。说这个真的啊,咱们说真的啊,那这个真的我是不是也没有参与计算,那谁替他计算的呀?是不是user I替的计算呢,对不对,那你既然提user ID来计算user I的计算的话,那你是不是按照user ID分组啊,相当于按照user ID分组,是不是就是一行就是一个user ID,对,也就你最终的这个cube当中,你是不是应该是一个user ID一行数据,那其实我最终聚合的时候,我应该按谁聚合?按照性别聚合对吧,对不对,那所以说你还得怎么做,你还得首先把每个UID得转换成啥成性别对不对,但是你会发现啊,是不是我们性别一共就俩性别呀,对不对,你要按照真的分组,最终你结果应该只有几条才行,两条一男一女对不对,男的有多少,女的有多少对不对,但是你现在的你数据量有这么多,所以说你这个查询的时候,还得经过一步啥一步转换,甚至还有一步进行聚合的操作。
08:27
对不对啊,那其实这个计算量真正的减少了嘛,计算量其实并没有减少,只不过就是你这个计算的时间发生了变化啊,如果说你不选用衍射维度,什么时候计算呀,查询之前计算,你使用衍射维度之后呢。查询之后计算对吧,那这样一来的话,那确实减少了这个预计算的计算量了,但是呢,它会降低我们的查询的这个性能吧,你查询的时候会变慢。啊,所以说这个衍生维度呢,其实啊,并不是那么的好用啊,并不是那么好用啊好,那衍生维度呢,通过刚才咱们讲的这个小例子,大家应该差不多已经理解了啊,它底层原理是什么样的了,那当然呢,这边可能光说呢,有的同学可能想象不明白,那下边呢,有一个PPT,咱们通过这个PPT呢,再把这个衍生维度,它这个原理从头到尾呢再过一遍,从头到尾再过一遍啊好,大家来看一下这个位置。
09:21
来看这个啊,看能不能看懂啊,这是我们,呃要这个要进行这个构建的两张表,一个是事实表,这是我们所选事实,这个呢,是我们所选的维度,事实表维度表,然后这两张表它的状关系是怎么样的呢?看一下啊,事实表当中是不是有一个A表的IDAID,那这个呃A的维度表当中是不是有一个主键ID对吧,是不是他俩进行照呢。啊,这是呃,连接学验没错吧,对不对,好,那这个先明确啊,然后咱们打开这个PPT。啊,给点开。呃,好,那这个东西呢,咱们先不看一会再说啊,那我们看这这是我们刚才那个实时表跟维度表对吧?啊,标题没出来啊,没关系,咱们往后看,看一看,咱们现在需求是啥,我们需求呢,将来要分析count c与E之间的关系,Count c与E,那你说你选这个维度字段的时候应该选谁呀。
10:15
选E呗,对不对,那你度量值选啥呀,度量值不就是看了C没错吧,这是我们构建cube的时候,我们需要选的东西啊那。假如说我们在选择E这个字段的时候呢,我们选的是不是选E的时候,咱们类型有两个,一个是normal,一个是derived呀,对吧?那假如说我们选的是derived,那选derive的时候,那真正参与计算的你说是E吗?不是一那个是谁。应该是AID吧,对不对,那这块其实它会替换的啊,也是构建room的时候,它其实是用AID代替了E,那所以说你代替完之后呢,本来你应该按照谁按照个应该按照E分组,对吧,那其实按谁分组的,它是按AID分组的,对不对,那所以说最终得到那个Q吧,应该是什么样,是不是应该这样的呀,对不对,看能不能看懂啊aidd啊等于1COUNT c等于1213141是不是应该是这个结果呀,对不对,但是你构建的时候用它构建行,但是我最终查询的时候还是用谁查询呀。
11:14
我查询我是不是肯定还是看E跟CRC之间的关系,对吧,所以你查询的时候还得怎么办。还得把这个地方这个结果是不是还得给它转一下啊,对吧,先转谁先把AID转换成D对不对,那这个怎么转。怎么转呀?是不是根据这个维度表就能转,因为在维度表当中,我们这个ID和这个E字段是不是肯定是有一个映射关系的呀?啊,这个映射关系或者也可以叫做什么关系啊,叫做衍生关系,这个地方为什么叫衍生维度啊,啊是不是你可以通过你的主键字段。通过主键字段是不是可以映射到你的每一个维度字段呀,对不对,那这个关系呢,咱们就管它叫什么关系啊,叫做衍生关系,也就是说你也就是说你可以通过它的主键衍生到你的维度字段,这就是所谓的衍生嘛,啊,这就所的衍生啊,那既然他们有这层衍生关系,那所以说我们在查询的时候呢,就可以将AID是不是转换成E呀,对吧,就根据这层衍生关系,或者说我给它提取出来了,就看这也就说你随便给我一个,这个应该不是A啊,这应该是谁呀。
12:22
这个是AID,对吧?你随便给我一个aidd,我是不是都能得到一个跟它对应的E啊,对吧?那这个也是aidd啊,这个写的有问题啊,都是aided ID能够对应到E,好,那你就替换呗,那替换完之后是不是应该结果是这样的,那一对应的是谁AB,那二对应的是谁,三对应谁C,那四呢对应的A,也就是说你最终替换完之后,这是的结果吧,但是你会发现这个结果并不是咱们最终的结果吧,啊为啥?因为有两个A啊,因为你要是隔入by e是不是一个亿只能有一行啊,所以说你还得把这个E相同的字段呢,给它聚合到一起,也这块呢,你需要再做一步聚合啊,那就是这一步聚合是什么时候做的,是不是就是你查询之后做的呀,对吧?那这一部分是不是肯定需要一定的计算量啊,需要哎,它肯定会拖慢咱们的这个查询时间的啊,是这样的,所以说这就是衍生维度,它的这个从头到尾的一个原理。
13:16
啊,原理很好理解啊,那这边呢,我们所以说就得到一个这样的结论啊,咱们可以看一下,虽然衍生维度它确实是具有非常大的吸引力啊,确实它能够极大的减少计算量啊,尤其是什么时候啊,尤其是你从一个维度表当中选多个维度的时候,如果说这些维度你都选衍生维度,那这个计算量是不是能极大的降低对不对,那极大降低算量呢,那带来的这个后果呢,就是啥呀,就是你查的时候就别忘了啊,就是一句话啊,就是啊出来混迟早要还的对不对,你前面不算,你就后边算啊,反正这这个计算量肯定是是一样的,是这样的啊,那所以说呢,这个虽然具有很大非常大的吸引力,但你这也并不是说我们所有维度表上的字段呢,都得变成衍生维度,如果说从维度表主键到每个维度表所需的这个聚合工作量非常大,这个所谓的聚合工作应该指的是哪儿啊,是不是就这个后期的这个聚合量啊,对不对?如果这块这个聚合的这个,呃,这个聚合工作量非常大的话呢,那则不建议使用衍生为。
14:16
维度啊,则不建议衍生维度啊,那怎么去判断这个聚合量大不大呀。怎么去判断呀。怎么去判断这个聚合的工作量大不大呀?这咋判断呀?其实很简单啊,你就看什么,你就看一下,假如说这是我的一张维度表,对不对,哎,咱们以那个以这为例吧。以这为例啊,咱们打开这个。啊,那咱们这儿是不是有多个维度表,多个维度表当中我是不是选了多个字段对不对,那怎么去判断我们哪个维度后期的这个聚合量,这个聚合的工作量会大呀。你可以猜一猜这里边谁的聚合,聚合的工作量会大一些。谁会大呀,这个字段大不大?
15:02
这个大不大,Province name。这个句子这个后期的聚合量大吗。这个根本就没有聚合量,为什么呀,为啥?因为你这个pronce name跟你这个pronce ID是什么关系,一对一的关系啊,对不对?你按ID聚合跟你按province name聚合是不是效果是一样的,这个你需要聚合吗?浩局不需要,你只要替换一下就完事了,对不对?那谁的聚合量大?这个聚会量应该是最大的。对不对,因为什么?因为我的user ID我会有成千上万个,但我的性别呢,只有俩对不对,那所以它的聚合量是不是肯定是比较大的呀,对吧,你就根据这个去判断它的聚合量大不大啊,跟据它去判断也是这边呢,我们也是一个概念啊,你可以怎么去判断呢?这样去判断啊,来我们看一下啊,就是说这是我一张维度表对不对,那维度表我这是不是有主见啊,那我这是不是有维度字段,你可以根据一个概念去判断叫什么叫奇数的一个概念。积顺啊,什么叫积顺呢?
16:01
哎,那比如说这是我的主见啊,所谓基数呢,就是count distinct的值,Count distinct是不是就是去重之后一共有多少个呀,这个值就是所谓的基数啊,那如果说我的这个主键的基数跟我的这个维度字段的基数,如果它俩一样,那你需要聚合吗?呃,和后期需要那个聚合吗?其实不需要的啊,或者说你的聚合量是很少的,如果说我这个基数相差的比较大,我的主见的基数比如说是10万。那我这个维度字段的基数呢,比如说是二,那这个基这个聚合量是不是就很大呀,对不对,你就根据这个去判断就行了啊根根据它去判断,就是所谓的基数的概念啊,根据你的主见和维度字段的这个基数去判断,如果基数相差不大,那聚合量就是就就就小,如果基数相差的很大,那聚合量就大啊就这个意思啊,这个应该也是比较好理解的啊好了,那就根据这个判断就行了啊,然后这个衍生维度呢,其实咱们呃正常情况下,如果说我们这个呃条件允许的话呢,那咱们这个衍生维度,那尽尽量不要去使用啊,什么时候才去才呃才去使用这个衍生维度呢?啊,假如说我现在因为咱们这个离线阶是不是都晚上去做呀,对吧?假如说我今天晚上从这个12点开始跑,对吧,那比如说跑到第二天早上九点的时候啊,因为一般情况咱们第二天上班时间九点十点对不对啊,那这时候上班,上班之后是不是需要用这个结果呀,对吧?如果到这个九点的时候,你这一晚上算不完,这个计算量太大了,我实在是算不完了,那这时候你可以考虑。
17:33
使用衍生维度如果能算完啊,那在第二天早上我们上班之前,这个数据数据能算完,那你这时候呢,就没必要使用衍生维度了,对不对啊,因为咱们,呃,毕竟麒麟是干什么用的,是不是及其查询呀,我最应该保证的保证的应该是啥呀,因为它的查询速度对不对啊,所以说呢,大家这个延伸维度呢啊,就是酌情对待就可以了啊,酌情对待就行了,好,那这就是咱们所谓的衍生维度啊好,那我把视频录一下。
我来说两句