00:00
接下来我们看一个3.0的新特性,动态分区裁剪,那其实这个东西咱们前面讲位置下推的时候,已经其实已经有体现了差不多的思想啊,那其实它的核心思想就是先将一边做的过滤结果当成只查询呢,查询出来再将其。用到的分区join到另一侧,也就是说左边过滤完之后,它会当成子查询,拿到另一张表当做过滤条件提前过滤,那这一点呢,就跟位持下推有点相似的啊,那我们看一个实际的例子来看呗,那这一边是两张表进行join,然后呢,关联条件呢,是它们的一个分区字段,然后呢,其中一张表指定了一个范围过滤啊,指定了一个过滤条件啊,那这个时候你看。是扫描一张,呃,T2这张表嘛,呃,对T2这张表进行查询,而且执行了一个什么push,取到是不是位置下图样啊,然后呢,另外一边他会做什么呢。
01:07
他会对他做一个分区裁剪,呃,这边你看啊,他首先扫描出所有的分区,然后呢,提前过滤对吧,怎么过滤呢,你看T1的。分区在。T2的这个条件里面,是不是把T2当做子查询写进来了?那就对T进行了过滤,那两表都过滤完了,数据量都比较小了,再进行一个join。哎,这个时候呢,就是动态分区裁剪啊,比如说这有一张表A啊,就T1就就AB吧,别T1T2了啊AB,然后这张表假设有特别特别大啊,比如说有亿条,那这边有1000条。就是过A表过滤完只有1000条,那如果没有动态分区裁剪。那咱们位置下推的时候,只对它进行只对表烟进行提前过滤,那么如果是表B呢。
02:06
对吧。那其实咱们前面讲的时候,在on的场景下,两表都会,呃,执行位置下推是因为加了一个动态分区裁剪,咱们现在单独拎出来讲啊,呃,那这个东西呢,我们看看呃。表A剩余1000条,那么他就会以它当做子查询条件,对表B进行一个过滤啊,也就是说表B的数据必须在这1000条里面啊,然后呢,他就把1亿条提前过滤出来,剩1000条那两边的1000条再进行交易,那么压力跟性能就好很多了,压力就小很多,性能提高很多,但是它使用有一定的条件啊,呃,是这么一个,在修剪的表久远的时候,蚯引条件里必须有分区字段啊,第一个条件,蚯引条件有分区字段,看到这个呢,其实嗯,所以它使用场景有限,如果咱们日常是做T加一分区啊,T加一的分析啊,那么肯定都是已经过滤完分区了,只有一天的分区,所以其实意义不大了,就啊咱们所以关注点还是关注咱们的位置下推就行了,那么如果是需要修剪左表,那么join必须是什么呢?Inner join left join或者right join。
03:19
或者left join对吧。那反之也一样的,要修剪右表,那就是inner,或者呃,Right me join或者left join。如果左表如如果是左关联,无论右表有没有这个分区,左边的值都在,就不需要被裁剪对吧?也就是说没有过滤的右边呢,不管过不过滤都一样,那就不用管了,好,另一张表需要只存在至少一个过滤条件。求AB,然后分区字段关联,然后呢?必须要有一个过滤条件啊,这些咱们都很熟了,它是有这么一个参数可以来弄的啊,可以来弄,咱们直接来看一下吧,啊,这是咱们的d d PP test,那这个参数呢,我现在是将它打开了。
04:13
我先把它关闭for,然后呢,咱们在本地查看的一个执行计划就可以了,来执行,哎,我们先看一下吧,这边是有两张表啊,两张表一张叫student,一张是score,那这边在咱们初始化数据的时候啊,后面我添加了一个方法啊,是咱们现造的数据,呃,先造了100万条,呃,然后呢,把它写到student转成student,再写到这张表里,那数据怎么来呢?这个item就是咱们生成的数据,那在这咱们取了一个随机数啊,然后呢,第二个字段。啊,第二个字段是name,就随便拼接个名字给他,第三个字段呢,是咱们给个随机值零到99,也就是说我回头想弄那个,这个也是零到99,我们看一下分区啊,最后一个是分区字段啊,也就是说分区是零到99,一共100个分区啊,100个,然后呢,以partition为分区字段写进去,下面那个也一样啊,这造了100万条,然后呢,这是分区字段啊,也是100个分区啊。
05:28
然后写进去,我的数据是准备好了,所以我现在就直接执行这个circle,我们看一下条件满不满足啊,首先inner join join类型满足要求,第二一个分区当做关联条件也满足要求,第三要有过滤条件也满足要求,好,那我们就直接来执行。看一下动态分区裁剪的执行计划长什么样子,那一会呢,咱们也可以去看一下,呃,Web UI的执行图做一个对比啊,这也是可以的,来,我们直接看物理计划就行了。
06:05
物理执行计划,首先呢?扫描了这张Q表。对吧。啊,然后呢,对它做了一个过滤,什么过滤呢,小于1000。然后呢,做了一个什么广播交换啊,做了广播交换,同学们广播交换,那另一张表呢。这是student表扫描出来他也做了一个什么广播,哈希join。对吧。那其实从这呢,咱们能看到什么?呃,重要的东西吗?咱们现在是没有开启动态分区裁剪了。没有开启的话,其实另一张表。是没有提前过滤啊。对吧,那这个时候如果另一张表,比如说这张过滤出来才剩1000条,那么这张。另一张表这边还有100万条,那这个时候就诊效率就要差一点了,那接下来我们对比一下,打开色为处。
07:20
嗯。好,现在出来了,还是看物理执行计划啊,那么看第一个呢,扫描SC这张表,它会提前什么进行过滤啊,学校这张表,而且进行一个广播交换,好接下来看上面了,呃,这是一个结果。交换,这个交换就有讲究了啊。呃,然后呢,这边做了做了一个什么子查询广播。动态分区裁剪。其实这个的意思就是什么呢?比如说这边通过过滤啊,小于1000,那是不是有1000条啊,那这边还上面这个还是100万条,那么他在做这个的时候啊。
08:06
就会把它将当成子查询,把它查出来,然后做一个什么呢?动态分区裁剪,那这个时候它的100万条就变成了什么1000条。啊,这个就是动态分区裁剪,把对方的过滤完之后当做子查询,然后自己也做一个过滤,那再之后呢就好了嘛。那这个可能看这不太明显啊,但是如果呢,咱们去看word端有数据统计啊,那就非常明显了,然后他俩呢,做一个join啊没了。这就没了。对吧,所以跟咱们单纯的位持下推还是有点区别的啊,还是有点区别的。这是特殊用法关联条件。那这样,呃,咱们接下来把这个吐掉,然后把下面打开啊,这只是做一个打印啊,行动扇子,嗯,然后呢,咱们吐的时候来。
09:09
咱们先来一个force。诶,我我之前有一版。那我直接提交就行了呀,对吧,我直接提交就行了。嗯,咱们找这个吧。嗯嗯。这个名字打错了啊,这个应该是test,不是tenny。我们真心看一下啊。看一下他是哪一个,然后呢,咱们再去。对应的开起来或关掉,对比一下这些图就可以了,等他跑完跑完了我们先把代码改一下再提交啊那个把这个explain去掉,然后把local星注掉,然后改成false。
10:13
因为之前应该是处的一个状态。然后我们现在对他打包,让他跑起来,先看一下之前的执行结果。好,他打着吧,来,咱们来刷一下d BB test好进来,嗯,咱不关注其他的,关注circle。点这边是执行计划,大家注意看了,现在是第一次扫描score这张表,然后呢。错了一个过滤。过滤完之后,大家注意这边执行的一个什么。广播交换。然后呢,复用这个交换,然后呢,这个就是所谓的子查询广播,它也就是说啊,把前面那个过滤条件小于1000的这个结果集当成什么子查询,然后给到谁啊,给到student这张表,让他呢也做一个过滤。
11:15
它过滤完之后数据就少了啊,数据就少了。你看。它读取的大小剩这么多对吧。那看上面这个,那你看又查了一次什么学校这张表前面这里查了一次么,这里又查一次,查一次他还是要进行过滤,过滤完了。做一个join。这就是他这边减少的一个数据量了。
12:07
应该打完包了,我们再来看看没有开启动态分区裁剪的一个效果。然后快速执行。我们等他跑完啊,等他跑完。执行完了,我们来这边截个图呗,那这边已经变成了一个广播哈,Join。然后再看另一个。新的啊,点三号。点它好,这边大家注意看,会不会少两次score表啊。
13:02
那首先第一次呢,这个学校表。查了一次,然后呢,过滤剩1000条,那STUDENT2呢,他并没有咱们前面这里是不是多了一点,然后广播交换,然后只查询,然后再给到他,对吧,现在就没有了啊,现在就没有,现在直接这边就过来了。区别就在这儿啊,还。这就是猎裁剪。啊不,那个动态分区裁剪啊,那这边就会多几步当成子查询传给他。这边没有。这是一个动态分区裁剪。
我来说两句