00:00
接下来呢,我们就需要来呃,具体给大家讲讲它的一个实现原理啊,其实也特别特别简单啊,原理啊,都是自动完成的啊。那。他这一边呢,它使用的语法很简单,跟一些数据库都一样啊,但是大家注意一个啊,目前的版本啊,只能在单表操作,也就是说不支持说两表就引这种操作,做一个雾化索引啊,还不支持啊,现在还不支持,这点你要注意啊,那么物化视图。咱们说这么多是创建越多越好吗?啊这边就是什么意思呢,就是说呃。比如说我这样一张基表,贝斯表,这么多个字段,那可能我查询。经常用的查询有很多,我每一个查询都给他建一个物化视图,每一个都建一个物化视图,那这样其实是什么,你的资源不太够啊。
01:01
是吧,浪费资源,所以这边这么多话,总而言之就一句话提取什么。公共部分,你看从查询语句抽象出来共有的分组和聚合方式,也就找它们的公约数,因为这个公约数就是什么,呃,这个多个查询都能匹配到这一张物化视图,那这样首先第一个好处,你不用见太多的物化,使图不会造成太大的压力,而不会浪费过多的资源。第二,一个大多数查询能匹配到,那不是很理想吗?是吧,其实说这么多就是物化视图的数量还有质量,你做一个取舍好吧。那不多啰嗦了,那我们看一下创建的语法,先了解一下啊,那这个是官方,呃,人家分享的一个,那我们看一下一个案例来这个,这是创建了一张普通的表,对吧,这些都是普通的字段啊,没有什么聚合模型,那些没有,那物化制度表怎么建呢?语法很。
02:07
跟其他的差不多,Create物化视图,这个就物化视图嘛,对吧,然后起个名字as,后面再跟上什么对基表的一个查询语句,我们不是说物化视图要记录操作啊,同时也会记录结果吗?在创建的时候要指定什么操作啊。那创建过程呢,呃,就提醒一件事啊。他会异步的在后台啊,去执行这个物化视图的这个查询逻辑,并且保存这个结果,那么如果在物化视图构建期间。不影响你对机表的操作,你就正常去查,正常去导入新的数据都行。因为这个物化视图这个作业啊,它会自动处理什么当前的什么存量数据和所有新来的数据,它最终会保持一致性啊,这一块是自动的啊,就说这个小问题再往下走啊,我们看一下它的查询啊,这边的案例是一个什么场景呢?
03:10
前面我们建了一张销售表,对吧,就简单这么几个字段啊,我们简单瞅一眼啊。销售记录表啊,有什么呢?一个ID,还有销售员的ID,销售的日期,还有一个什么来着。啊,还有一个金额对吧,这个是销售金额就没了,就很简单啊,这是一个销售记录明细表那么看啊,那我们如果呀,对他创建了。这么多个。物化视图啊,MV就咱们给他起的名字啊,物化视图一,物化视图二,物化视图三啊,创建这么多,他会自己去匹配最合适的啊,这个查询语句,我正常查询这个机表。
04:02
他会根据这个语句去匹配最好的一个物化视图,怎么匹配呢?来我们看。他会,呃,具体呢,我们往下走啊,这边还没展开讲,那他是怎么个匹配呢,怎么选择最优呢。对吧,我们看它会根据条件筛选出一个最优的物化视图。那怎么筛选,我们后面来讲这个最优路径选择,再来讲,那我们先整体了解一下,就是前面三个三个物化视图,根据这个查询语句我匹配到啊,物化视图一是最优的,好匹配上之后它还会干什么事,叫做查询改写。对吧,你看这是原始语句,它会改写成什么。他查了什么,变成查物化视图一这张表了,看到没有,这就是是自动完成的,不用我们去做啊。
05:03
就两个步骤啊,选最优查询改写,那下面呢,我们就具体展开讲讲怎么选最优,怎么进行改写,好吧,来,那首先我们了解一下它自动改写的一个原则。就查询中,就基表的查询是上物化视图查询语句会改写成上,那前面这几个都没变对不对,关键的是在后面这几种,呃,你对机表执行这些操作,它都会改写成这个方式。那如果你不理解,那你就这么理解就行了,呃,你的这种写法它会优化成这种写法,那既然是优化,肯定这种写法效率高,你知道这一点就行了啊。好,那么接下来就是展开具体讲啊,我们刚才啰嗦那么多,就是整体给家大家过了一遍,就是说会自动选择优,会自动查询改写,对吧?啊,接下来我们来一个一个研究啊,接下来是展开具体讲啊,思路不要断啊,然后我们看一下怎么选择最优,我们先简单的来理解啊,这个还是刚才的查询语句,我们看一下查询的这基表,然后呢,呃,做了一个过滤,根据日期过滤,然后做了一个根据销售员ID进行分组。
06:26
然后呢,求了一个销售的金额对不对,这么一个查询语句,呃,那他经过一定的。呃,选择最优的策略之后,最终选择出来是什么呢?啊,剩下基表还有MV这张物化视图表那。也就是说这两个被淘汰了,Pass啊,那这两个再怎么角逐呢?再根据前缀索引的聚合程度,它进一步的选出啊,我最优的就是走物化视图一这张表啊,这个是我们简单来理解啊。
07:02
那我们来看一下具体的过程啊,具体过程来看图就行了啊。那这个是我们的一个基表,那这三个是我们创建的物化视图,那我们看看物化视图分别是什么,你看这里有销售员ID,这里有日期,这里有金额的聚合,这是第一张,第二张是什么呢?商店ID,销售日期金额,那这个是销售员ID销售金额啊建立了三个不同的。啊,物化视图表,好,那接下来是怎么个角逐过程呢?诶还是这个circleq语句刚才讲过啊,那我们说一个circle口先执行,是不是先看过滤条件啊,Where对吧?好,它是判断什么where字段是不是这个销售日期啊好,接下来他就会去看,诶我。基表还有包括物化视图表是否包含这个字段,对吧,那我们这里一看是不是基表包含的日期,这肯定有吧,好。
08:09
它符合条件,再看物化视图一,它是不是也有日期字段,好,它符合再看物化视图二。他是不是还也有一个日期呀,好,他也留下。再看MV3,没有日期好,你被pass掉了,所以经过第一次过滤之后保留的是谁啊?基表MV1MV2。对吧?这是第一次角逐好第二个语句该看什么了?看goodbye了,对吧的字段是什么?销售员的ID那仅那这三个里面要去选,再看一下他们是否包含这个字段,基表肯定有,不用想,对吧?物化视图一销售员ID有符合条件。物化视图二,看一下有没有销售员ID,没有啊,出局啊,物化视图二出局,所以经过group字段的过滤,最终剩下的就是基表,还有物化视图一,好,再进一步,是不是该对select字段进行呃,一个过滤呢?销售员ID过滤过了,接下来是不是根据这个销售的金额进行过滤,对吧?销售金额好,那我们来角逐一下。
09:27
有没有销售金额呢?有啊,基表肯定有嘛,反正基表肯定是留到最后的啊,你要明白这一点啊,物化视图一有没有销售金额呢?啊有好,你俩还继续留下来啊,到这一步再继续留下来。在最后呢?到这里是不是角角逐到最后啊。接触到最后啊,包括带字段这两个一比较都有啊,它俩是不是剩下的。
10:00
还没角逐出来对吧,好,还要再继续走。接下来剩下一个基表,还有一个物化视图一。接下来两个怎么选呢?啊,两个原则,第一个前缀索引谁能匹配上。能匹配上前缀索引说明什么?是不是效率高啊对吧?第二个原则是什么?聚合程度,谁的聚合程度更高?那回头我要做的事是不是就少了,省事啊?那我就选谁对吧?好,我们来看一看。前缀索引,我们是不是主要看这个过滤条件呢?过滤条件是不是这个日期对不对。那我们看看这个日期。他这里是不是有啊。对吧。那我们知道,嗯,首先从排序的角度来讲,基表是不是没有做排序啊。
11:07
对吧。这边没有,但那物化视图表示会做排序的啊。你看啊,Base表的销售日期是非排序列,物化视图表日期是一个排序列,这是第一点,从第二个原则来讲,聚合程度,物化视图的这个里边是不是已经用了一个sum的聚合模型,所以它的聚合程度是不是比原表基表更高啊?这2.1比较,最终选择胜出者是谁?物化视图一好,到这里为止就是我们的什么。最优路径选择。就给大家介绍一下原理啊啊,那接下来该干嘛呢。查询改写了啊,该查询改写了,那怎么改写呢?我们看一下,我们现在已经明确了要。
12:05
好,在这里啊,查询该写怎么写到这了。MV已经胜出了,接下来查询改写,那这个circle语句就变成了查什么MV1对吧啊,然后其他的过滤条件的group啊,Farm码都没变啊。为什么没变呢?我们说了前面来往上翻,往上翻,这里我们说散会改写成什么,还是善美,没有什么好优化的,只有这种特定的东西才会优化成对应的这个更好的函数,这个后面案例我们也有讲啊,有讲。比如说我们这边查询改写有另外一个案例啊,就他选择完最优之后啊,呃,他原先做的比如说是一个套distinct的啊,我们求UV是不是很常见呢。
13:00
对吧,是不是要做一个count distinct,按照用户ID啊去重统计,那像count distinct会自动改写成bit map union count。这个就是还是刚才这张图嘛啊。来。Count distinct会改写成变成ma相关的函数啊,效率更高啊好,那基本原理呢,就大家应该比较OK了啊,那使用限制呢,首先第一个它支持的聚合函数就包含这种萨马inna mass count。以及计算PVUV,就像刚才的count,对吧,转换成那个bit map,或者转换成啊hyper log log这种。一个。好。另外呢?聚合函数的参数不支持表达式啊,不支持复杂的写法,比如这样子。
14:06
函数聚合函数sum里面啊,有多个列去组合了,不行啊,仅支持单列啊。使用物化视图后。他其实是。损失了部分维度数据,因为你只截取了部分列,对不对,或者部分行啊。它有,所以对一些DML就操作语句有一些限制啊,比如说啊,如果物化视图key中不包含删除语中的。条件列则删除语句不能执行。基表啊,影响的是基表啊,因为你这个删除逻辑它,嗯在物化视图里面无法,如果就是说呃,原先基表ABC,那物化视图只用了A跟B,那现在你把C给删了。
15:05
那这删除语句不能执行,为什么呢?因为物化视图。没有这个C这个列。啊。它会影响啊,影响你去做这个DML操作可能啊,那这个时候怎么办呢?先把物化视图干掉,那不就得了吗?啊,解决提出问题的人吗?啊。然后再去记表,你想删你再去删,删完之后再重新建五法师图,只能这样子啊,复杂一点啊,另外就前面讲的啊,不要见过多的五二视图。最好找一个公共的逻辑,这样最好大家可以复用啊。那具体的数量呢?如果一张机表物化视图超过十张,速度就变慢。为什么呢?因为你虽然数据进的是一张机表,你建了几十个物化视图,我们说了物化视图记录操作对吧,你这里比如说新增了一条,呃,ABC3条,那这三条数据比,比如说他们都用到了这些数据,这个视图要跑一遍。
16:10
这个要跑一遍,这个要跑一遍,这个要跑一遍,这个要跑一遍,这个要跑一遍,对吧,这是不是一种放大呀。对吧,操作放大,所以不要太大啊啊,相同列不同的聚合函数不能出现在同一物化式中,比如说对于列A啊,我既用了sum又用了命,那是不行的,一个列只能有一种聚合。说。对于唯一。唯一模型只能改变列的顺序,不能起到聚合的作用。就unique key,它并不能得到一个粗力度的聚合操作,因为它场景比较特殊嘛,它也不算是聚合对吧?啊,这是我们给大家啊捋面原理,最其实这个原理你。不影响大家使用,为什么都是自动的对吧,只是让大家更了解核心就两件事儿啊,就这两件事情。
17:10
一个最优选择,第二个查询改写。
我来说两句