00:00
接下来了解一个Doris对join的一种优化使用方式,叫location join,它呢是在0.9版本引入的。那作为主要的目的就是提供一个。本地的性能优化,减少呢传输的耗时,加速查询。最关键在哪一个本地啊,本地性能的优化,然后呢,减少传输,这是两个重要的效果,那么看一下它的原理,首先要了解两个东西,两个概念,一个叫group,一个叫group STEM。对吧,简称呢,呃,Group就称为CG对吧,STEM就CGS。那么一个CD就相当于说一个分组,一个编号一个组啊,就是说我们将一些将表啊,啊,给它标记一个组名啊。
01:00
那一个CG里面会包含一张及以上的table,对吧?看你需要哪些表,要加入这些组都可以啊,那么在同一个组里面的表都有着相同的STEM啊,STEM。那么有着相同的数据分片分布。这是CD的概念,那么CDS呢?它是用来描述CD中的表呢,它里面携带了什么呢?这个组的STEM信息,那具体呢,就可能主要是什么,一个分统列类型啊,分统数啊,还有副本数这三个东西。主要是这三个啊,当然还有其他一点点。所以那这两个概念大家也知道对吧,一个你可以理解,为什什么呢,一个组就分组的名称啊,分组哪个组的,另外一个呢,就是组的具体信息,包含了一些描述信息,像什么分统列,分统数,呃分统数对吧这些东西。好,那对应的这个功能呢,就是将。
02:00
呃,拥有相同CGS组成同一个组,对吧?那么这些表对应的数据分配会落在同一个B节点。是吧?那既然这两张表的相对应的分片都在同一个节点上,那我回头要join的时候啊,比如说你要做一个ID字段的关联,那比如说ID同样有123,这边也有123,那我们目标是不是相等值连接的时候。是不是一跟一做doing引二跟二做doing引三跟三做九对吧?啊,那我们现在啊,你想想他们的数据分片分布情况,两张表都在一个组里面,那是不是一样的,也就是说假设我有be有三个节点,比如说它们分布在BE1,这个分布在BE2。ID为三的分布在BE3这个节点上,那现在我要做九远是不是同一个节点,那直接在同一个节点本地进行九远就OK了,我也不用进行什么数据交换,数据传输,跨节点传输对不对啊,这也是这个的含义所在,我在本地就能join,而且呢,这样的话我就不用去传输数据了,性能也高了,对吧?啊,这就是这么一个目的啊。
03:17
那么这么讲起来是不是有点像咱们hi也好,是B也好,一个东西叫SMB就了。对不对啊,是有点像,但是这个更像是哪一个呢?像八体杀夫丘。这个SMB就更像是这个,那C在它的基础上加了一个什么数据的分布,一开始我就给你定好了,你直接在本地拿就可以不用传输,这个是呃区别所在啊,大家注意这个它的最重要的特点啊。简单来讲就是一句话,呃,我对表打上一个分组信息。然后呢,两张表呢,都属于同一个组,而且呃分统列的类型数量,副本数都一样,那这个时候呃,我在等值连接的时候,只需要在本地当前节点进行就验就OK了,在各自节点就啊不用交换数据。
04:12
好。然后下面呢,也有一个小案例对吧?你看啊,呃,这跟分筒字段有关对吧?一个表的数据会根据分筒的列值取一个什么哈希值,然后再取模,比如说分总数指定为八,那就对八取模,那我们是不是得到零到七这么八个分筒编号啊。对吧?取哈希在对八取模的话,假设我们见表时候指定分桶数为八啊,那这个称之为桶的序列值。那么大家注意一个桶内会有一个会或多个数据分片,为什么会有多个呢?我相信一个大家好理解啊,一个指的是什么?单分区表时?对吧,我只有一个分区,相当于说只有一个默认分区啊,然后呢,就是进行分筒了啊,那每个分筒一个数据分配一个table,这个好理解,但当我是多分区表时候,就有多个,为什么呢?因为分筒是不是对每个分区而言呢?比如说我一张表A,我有P1 p2 P33个分区。
05:14
然后呢,我分统数都是八,那最终比如说我们给它tablelet标一个编号。那这里是不是哈希曲模是不是有个零啊一啊234啊567啊对吧?那对于P2分区来讲,它是不是也有01234567对吧?对P3分区来讲,是不是也有01234567这么几个编号的那个分片了,那你看零号铜。你看那这个就属于什么。零号bucket。你看现在是不是就有多个分片呢?啊,所以分片跟具体的分桶之间的数量关系就是这么来的呗,那你再看三号桶里面是不是有三个数据分片,三个table thatt对吧,这是三号啊bucket。
06:04
啊,对吧,这个大家呃,简单理解一下就可以好,那我们在使用的时候要注意有它是有苛刻的条件的啊,并不是说你随便两张表拿过来,哎,我给你打个编号就OK了,那不行,有条件,第一个条件是什么了啊,你要join的表,它分统列的类型,比如说你要么都是int,要么都是什么什么,对吧?啊,你的类型要一致,另外分桶的数量有一致,你不可能说我A表分了八个桶啊,B表分桶是三个桶,这个时候你要实现本地这种location均,那不现实,对吧,因为你没法保证分布到呃对应节点。啊,这个是限制啊,分桶的这一设置。分筒列,类型、数量一定要一致。统数一致对吧。啊,分桶列的数量对吧?啊,这个讲的是什么呢?啊,比如说A表我分桶有A,按照A跟B2个字段分桶啊B表呢,我只按照A列进行分桶,这不行啊,这也不行。
07:09
对吧,那这就是咱们讲的一个类型,一个统数一个,呃,列的数量要一致啊,这是。因为三个东西一致呢,才能保证我们数呃数据分片能够一一对应的。啊,存放在对应节点啊,这是最基本的第二一个呢。同一个group,同一个C的所有表的分区。的所有分区里面的副本数必须一致。啊,因为这样的话,你不一致的话,可能会出现某一个分片某一个副本,然后呢,另外一张表,呃,他他这个副本所在节点没有另一张表的那个对应的副本,那这样还是会可能就用不上啊,所以这个也是有要求的啊,所有分区的副本数要一致。指的是什么?同一个组内的所有表的所有分区啊好,那第三一个就是说什么,我们对分区的个数啊,范围啊,分区列的类型,这个没有没有做强制要求,比如说你A表可能有三个分区,P1 p2 P3。
08:13
啊,然后B表呢,呃,它它是P1P p1p2啊,那无所谓啊,那A表你按照两个字段呃,范围即使P他的P1跟对方的P1范围不一样也无所谓啊。好,那前面呢,就是啰嗦了一大堆原理对吧,那么实际来看一下怎么使用啊,那它达到这个效果,那首先我们建两张表啊,要开启这个功能,其实啊。就是你在满足这些条件的同时啊,就分同列相关要求,还有副本数的要求都满足,另外你再开启一个参数就可以了。你只需要指定它的CRO的组名就OK了,如果不指定,默认就是没有啊。你把他们要join的表。
09:02
哎,然后呢,满足分桶列什么类型啊,数量啊,还有桶数啊都一致对吧啊。那就OK了,然后再把它们放到同一个组下面,那就就可以了,就很简单,使用很简单,那我们来见一下吧,来看一下这张表,呃,你看主要看分桶字段。我是按照K2这个字段是int是一这个类型int一个字段对吧,而且类型是int,统数呢是八,那第二张表呢,我同样是按照什么呢。K2这个字段。分桶那类型它也是int对不对啊,Int是一一样吧,而且是一个字段啊,统数也是八,那这就满足要求了,那分区数呃,副本数没指定,是不是大家都保持默认,那是不是都一样了。好吧,呃,其次呢,我在表属性里面指定了一个CG的名字,那就OK了,好,那我们来见一下吧,两张表啊,第一张表好。
10:04
第二张表。建完之后我们通过explain来查看就行了啊。查看一个执行计划。那在这里我们看什么东西呢?还是看join的类型,来往上翻,往上翻往上翻,诶好,这里有一个什么哈,Join。然后使用inner doing,那么大家注意后面现在是不是没有括号了。在上一个视频,我们是不是讲了,它这边如果是广播会显示一个broadcast,如果是shuffle doing是不是会显示一个partition?的对吧,但是现在通通没有,而且下面呢,有一个字段叫什么location true表示呢,我们这个doing它走的是location join。啊,那它的等值条件是什么,对吧?啊显示出来。
11:01
啊。这个就是开启了。那么要注意有有的人就说呀,那万一我一开始建表的时候没有考虑到这个事儿呢?我这个组没指定啊,啊,这个组没指定啊,但我分统列的要求是满足的啊,是满足的,那能不能再开启呢?还是说我仅能在建表时指定,不是你可以用什么呢?用out table这个语法去set就可以了。啊,这边我们就简单讲一下就行啊,那演示一下呗。那首先我们也可以去查看当前所有的group对吧,看这个有没有权限执行啊。这个需要root的用户去看对吧,受PC啊。但是查看我们现在已有的CG啊。一会再去看吧,然后呢,要修改表的组名,你看如果该表之前没有指定,他会检查STEM,并将其加入到这个组里面,也就是说你后面再加入这个group也是可以的,那如果你之前已经有组名,它会先它会怎么样呢?先从原有的组里把它移除掉,然后再加入我们新的这个group啊,就行了,那我们来演示一下啊,Out table。
12:21
啊,我们的表明应该都是TBR1TBL2对吧?啊,比如说我把表一改一下啊。表一,原先呢,它的组名是什么呢?是GROUP1对吧,我现在把它改成GROUP2啊。好了,那这个时候我们再来执行一下这个色语句。对吧,两张表就应。看他还能不能走,应该是不行吧,因为已经是不同组了啊,你再往上走。往上走,往上翻。你看。在join这一块,我们可以看到他走的是另外一种join啊,这也是我们一会要讲的啊,那这边他的location是什么?False理由是什么,他说现在表啊,没有相同的group是不是,那这个时候我们继续改。
13:17
把表一改回去,或者呢,我把表二也改成GROUP2,对吧,它分统列的类型数量统数是不是都满足条件了,还有分呃分区的副本数啊,都一样对吧,现在只需要相同组就行来。我现在把表二也改成GROUP2,再执行这个。来,我们或者用gra去看吧啊。来往上看。它现在变成了一个什么broadcast,诶,我们来,嗯。看一眼,看是不是有问题啊。
14:03
啊,不是吧,这个还是得在这才方便看gray还看不出来效果啊,那你看这个现在tune又变成了什么location啊。再看一眼gray。啊,刚才是没更新过来对吧,你看现在久远就不会出现那个广播了啊,前面是还没好啊还没好。对吧,这里是因为还没好啊。好,但是你通过gray的方式,你是不是看不出有没有location啊,你只看出一个它是内连接,也知道它不是广播,也不是沙风蚯蚓,仅此而已,对吧,好。这个就是我们location,这个可以说在我们实际使用过程中啊,特别好使啊,特别是你两张表数据量都比较大啊,那可以说location是最优的方式。
15:01
最优啊,咱们可以讲是最优的方式,因为它不仅实现了类似一会要讲的8k suble doing,也就是hi,还有Spark这种s MB join的方式,而且呢,它相对它还少了一个什么跨节点的数据传输,对吧,它直接在本地就能够实现啊这个join。啊,所以这个呢,啊,大家好好去理解啊,去使用。
我来说两句