00:00
接下来我们了解一下join。那么知道SQL里边,呃,一些简单查询,聚合查询,分组查询啊,一般来讲都没有什么大问题,但往往呢,对于join的一些操作可能会有巨大的开销,那性能的差异也是特别大,那我们介绍一下Doris,它其中支持的这么几种,就主要有这么四种。啊,那第一个叫广播join,广播join相信呃,大家如果其他方家有了解过的话啊,不难理解,像我们have里边是不是有个功能叫做map join。Map对吧,那么普比如说Spark里面。我们是不是也有一个叫广播就对,那他们的实现原理跟方式都一样,是什么呢?呃,将小表的。进行过滤后,然后呢,广播到大表所在的各个节点,那这个时候大表是不是只需要在本地的去跟那个哈希表做一个匹配就可以了。
01:06
啊,这种是他们join的一种方式,广播join,那么大家要注意啊,这种广播join是dori默认实现的一个方式。也就是说它默认就会走一个广播九,当然这广播join有一定的条件,它必须必须是一个等值九,也就是哈希join的这种场景。什么叫等值join呢?我们看下面这个例子,两张表进行join,那么关联条件分别是字段,而且呢是等号。你不能说,呃,这个city等于一个具体的值啊,比如说北京。或等于一等于二这种。某个字段等于具体的值,这种呢,可能没法去触发一个。广播剧。那应该会形成一个笛卡尔基对吧,还有一种呢啊不等值,就比如说不等于或者怎么样这种那也不行。
02:02
好,另外有一个细节是什么呢?虽然它会自动尝试广播经验,但是如果它预估小过大,它会自动切换到一个叫沙uffle join。对吧,那就不是广播表演的方式啊,那我们下一个也会去看。那要让他走广播join引我们说了,一个是满足条件它自动走,另外一种是强制指定啊,他走广播join,就是在我们join这个关键字后面加一个什么,加一个broadcast这么一个关键词,那这个括号也是要携带的啊,中括号也要携带,媒体通过执行计划来看一下啊,现在就是两张表join,然后呢,根据city这么一个字段做一个等值关联。啊,没有了啊,那么通过执行计划可以看到它的一个join类型,那么首先我先登录一下,先连接一下啊阿一杠大P9030-U,我用test啊杠P。
03:04
Use test DB,好,So tables,就拿这两张表来做一个操作啊。直接把语句拷过来啊,Yes pre,查看一下执行计划,那我们往上翻,往上翻往上翻啊,这边就会看到有一个哈希join的操作,哈希join,那么可以有一个东西叫join操作,这边使用的是内关联内连接,对吧?那后面显示的这个是一个什么呢?Partition的这个其实就是刚才讲的杀doing。另外一种doing,那这就验证刚才那句话,它自己会判断,如果广播join不合适,或者说它会自动切换成一个叫沙uffle doing啊,我们也称为partition的join。那这里是我们没有加关键词关键字对吧,那这个时候我们把这个语句修改一下,强制让他走广播join,那注意看在join后面呢,我加上一个中括号,里面写上一个broadcast。
04:12
让他走,广播就来这一下,来这时候我们再来查看执行计划,你看。在哈希教里面,他使用的现在就是一个广播的方式啊,从执行计划能够很清晰的去看到,另外一个事情呢,就是要给大家试一下刚才讲的那个。呃,就是我现在比如说我这边不是字段等值就位呢,我变成一个普通的字段过滤条件,它还会是这样吗?对吧,我先查一下这个词吧,City from那张表啊,我考个表明。好。你看这里有北京,上海,长沙深圳啊,我来个北京吧,好,我把它改完这个SQ语句等于啊一个北京。
05:06
你看现在关联条件变成这个样子啊。对表一的字段进行过滤,那我们这时候我们再看一下。再往上翻,往上翻,往上翻。你在这里会发现没有哈西球员,它变成了一个什么?就是不是笛卡尔机啊是吧。那么这个就是刚才我们讲到的几个要点,那接下来呢,给大家演示一下,它默认到底是不是广播就业。那现在因为两张表都有一点数据,对吧,它自动切成了沙doing,那行,我再根据这张表,我再建一张空表,没有数据的表。啊,来试一下,那这张表我们应该是在数据模型的时候去创建的。我记没记错的话,或者我们直接搜一下啊。找一下建表语句。啊,在这里。
06:01
好。在这个位置。啊,3.5.1.2。数据模型、明细模型。哎,就这张表对吧。啊,我改一下这边呢,表明我改一下改个三其他都不变啊。再建一张表,空表啊。啊,一回车好了,那么接下来呢。再回到我们刚才的地方,我把这个关联的表改一下。啊,那关联三这张表。关联条件也是三对吧。那现在跟刚才的区别就是对应的右表换成一张数据量特别特别小,或者说呢,就是没有数据,现在是一张空表是吧?那我们看一下现在也不强制在join后面指定广播,那看一下还会不会走广播,还是走的partition的join啊回车再往上走,那么大家可以看到默认是不是就走了广播呀。
07:09
是吧,啊。这个是给大家演示一下,这个广播就从执行计划去看,对了,这个执行计划其实还有一种更美观的查看方式啊,什么意思呢?那我在explain后面加一个关键词叫graphic,以图形的方式来展示执行计划,这样的话可能看起来更友好一点啊,Graphic来,我们试一下,你看我缩小一点。他的执行计划就变成了这个样子,你看,呃,是不是从下往上看呢?对吧,这执行计划,那每一个都很简单,这个是不是扫描,这个是不是也是扫描另两张表嘛,这是。左表的扫描,这是右表的扫描,扫描右表的时候,他还会做什么?对吧,那这边。会做一些事,那这边数据交换是不是就广播呢,广播完之后在这里去实现了一个哈希join,也就是采用广播join的方式啊,在最后到哪一步了,到聚合对吧?好,那你这么你看这种方式就比较舒服了啊,那看你的需要去看嘛,这给大家顺便呢也介绍一下,那再往下我们看一下这个沙uffle join。
08:25
啊。这两个都是Doris里面基础的两种join沙join,也称为partition的join,那么我们在执行计划里面能看到的就是这个称呼啊,这个称呼什么场景呢?当小表过滤后的数据量无法放入内存。那这个时候是不是正常来讲就OM了,内存超限了,那这个时候可以考虑用沙uffle join partition的join,那它的实现原理是什么呢?啊,就很简单一句话。按照join的key进行哈希。然后进行分布式,就啥意思啊,比如说我有一个ID啊,两张表,这是左表,这是右表,我的关联条件是ID,那这个时候比如说他有123,他也有123。
09:12
那是不是根据这个具体的值取哈希值啊?对吧,那一就跟一的数据放到一起去join,二跟二的就一起join,三跟三的就一起join,那这种呢,就不用全量去就对吧,比如说我。左表为一的数据,我就不用再去判断,跟二跟三,跟右表的二或者三,呃怎么样对吧,因为它很明确对吧,我值相等的哈希值肯定相等,我直接跟一进行,呃,交你就可以。进行一个分布式的就业啊。那这样的好处在哪里呢?因为广播的话,我们内存撑不住,那这个时候就分布式多节点呢,那这个时候对内存的消耗就会怎么样分摊开啊。相当于说做一个分布式的处理好,那这边呢,我们还是做一个什么表一跟表二啊,然后关联条件一个普通的CT字段。
10:09
这个其实我们刚才演示过了,对不对啊,因为我们一开始表一表二,呃,不指定的时候啊。啊,就是上面这个语句嘛,上面这个语句是不是自动走的沙坡就呢,来我们再看一眼啊,再回忆一下。来往上翻找到join,它是不是默认就自动走的partition的就也就是沙join啊好。那要让他走杀Le join除了自动切换之外,也可以强制指定啊,比如说这个还是在join后面指定一个关键字啊,括号括起来,中括号沙uffle。好一回车来往上翻,找到join join对吧?Part提的join,那甚至呢,我们是不是可以补一下这个,呃,表三是我建立一张空表,如果都不指定,是不是默认走的broadcat,那现在我强制指定啊,我在join后面强制指定。
11:15
呃,沙否?好,我们再来看一眼。那你看。自动走,自动选的时候是广播,那现在变成什么沙啊沙doing,这个就是呃这两种Q方式的介绍,还有一些呃现象演示,还有他们之间的一个自动切换。那这个就比较简单了啊,这也是常规的两种交易。
我来说两句