00:00
那后面几个咱们就先介绍介绍一下一些场景啊,一个是分布式表。他们前面这些交是不是都单机表啊,也就是说不是分布式表对吧,那分布式表是要要使用什么global,为啥呢?咱们什么叫分布式表,比如说我现在有三个分片,知道分片啥意思吗?你就理解成三个节点好吧。然后我建建了一张表,它是分布式表,我叫表A,那它的存储位置是不是三三个都有啊,这种就分布式表啊,数据存在多个地方都能组合起来,好,那现在就有一个问题了,我表A跟表B做交引,我A交引B。那你咱们之前说他是把右表加载到内存,然后去找A表里面有没有是吧,那是不是这里得找,这里也得找。
01:01
这里也得找,那它怎么实现的呀,他是不是得把表B分发到每个节点的内存上,比如说它内存占十个G,那他这里是不是有用了十个G,这里用了十个G,这里用了十个G啊,然后每个地方内部进行交对吧。是不是,所以我说即使是分布式,其实最终也是转换成本地交易,但是这样是不是有问题啊。内存问题啊。是吧?就不太好,但这个时候如果是分布式表,我们加上global join前面加上一个global。那它只会什么,不会看接收查询请求的那个节点查询一次,大家注意一次如果不加global会怎么样?每个节点会单独发起一次对右表的查询,也就是说咱们刚才的例子啊,A表它那三个节点,那比如说B表在这,那这个要发起对它的查询,这个要发起对它的查询,这个也要发起对它的查询,如果右表同时是一个分布式表呢?
02:12
三乘三啊,会算啊,那是不是九啊,九次查询啊,那如果是格萝卜,它是什么呢?是不是一共几次啊?在接收请求的那个节点查询一次。嗯。是不是三次就够了,可能。对吧,可能三寸就够了,因为你想想,呃,如果做了,其实更深层的优化是什么?就数据的一个分布情况,你要交的数据难道在三个地方都有吗?能理解这个意思吗?比如说我要交引的某一条数据是ID为一,那它A表而言,它是不是可能在这个分面上,那么对B表而言,是不是在这个分面上,但实际上你是不是只需要这俩做一个交引就行了,你没必要查九次。
03:08
对吧,那如果你能进一步优化到这个程度,是不是更完美,当然这个有一个什么要求你的数据的组织。要有规律吧,这种就比较麻烦,比较复杂了。就比较复杂了,这个有点像咱们hi里面的s MB doing,它是不是使用有条件的,首先你必须分头必须呃指定排序字段对吧,等等等等,还桶的数量还有讲究,你要成比例,两张表的桶数要成比例。就很麻烦啊,所以你要实现到这种效果当然是最好,但可能条件比较苛刻啊,条件比较苛刻,那最好的就是加个global啊,他只会在接收查询请求那个节点查一次。而不是每个节点我人群里面。
04:01
所以你记住,你简单记的话就是一个是N次,一个是N的平方就行了。那这种现象叫什么?查N的平方次叫什么查询放大啊?如果别人,呃,可能别人会跟你问click house,你有没有遇到过查询放大的问题?那你怎么解决的?你要知道说的是啥。首先你要告诉他,查询放大发生在两张分布式表进行join的时候,并且没有加global。然后你又可以给他举例,比如说A3的分辨,B3的分辨。A在三个分片,B在三个分片,那可能就是每个分片都去查对方三个,也就是三乘三嘛,所以是九九个嘛。对吧,那如果加了global可能就不用了啊,他只需要在接收查询请求那个节点就行了,比如说B表可能他只查一或者只查二只查三就行了。
05:01
Global,那还有一个使用字典表,我们数仓有一个概念叫什么数据字典,什么叫数据字典啊,有点像Java里面的常量。或者叫枚举是不是?枚举大家还记得不?枚枚怎么写来着?这不是板吗?一个板一个又是犬,哎,怎么突然傻呢?我,哦,对啊对啊,突然就懵逼了,对吧?昨晚睡了仨小时懵逼了啊,枚举,那咱们枚举是啥呢?是不是一个里面是有几个几个值,然后是固定写死的呀,对吧,字典不就一个意思吗?你你想想你查一个新华字典,你你查一个什么字,它的景色是不是也是固定的呀,就固定词,固定意思,固定位置啊,对吧,那咱们通常就是一张表一些比较死的值。
06:08
那就是把它作为一个字联表,那这边是什么意思?如果你进行交易的时候,你可以把其中一张表创建成字联表,但是它有一个问题。它是常驻内存的,咱们普通交蚓是不是只蚓发生的时候才会把右表加载到内存的,但它不是这点表是永远在临存里面,但是这样有什么好处啊,对坏,所以并不是所有场景都适用啊,并不是所有场景都适用,那字典表在click house里面,可以是自己建的表,也可以是外部的文件。什么意思啊,我我有一个规则啊,比如说一对应的是什么,二对应的是什么,三对应的是什么,对吧?那我是希望通过这个ID join取出它固定的这个值是什么意思。
07:00
那这个时候如果数据量不大,你可以把它呃存在一个文件里,然后呢,丢到服务器上面配之后你在可house通过字典表的语法把它映射上,当然配置文件也得改啊,配置文件也得改,那就行了,那就变成一张字典表了。你先知道这回事儿啊。那如果你要看语法,我告诉你在哪啊,这块咱们先不做介绍啊,看在我们的circle。哎,我想想在哪啊,应该是安井吧,嗯。不在这儿,那就是这,我忘了在哪里了。啊,这里在什么呢?Reference,然后里面有一个字典。在这里它分为什么,诶怎么一下就跳进来了,是不是一个内部的,一个外部的,内部就是你建的表,外部就是可能来源于外部文件,也可以来源于MYSQ啊等等等等,那你可以选择其中一个,比如说内部的。
08:13
啊,没有案例啊。外部的这个我们去细看啊。它外部的分为这么多步骤,这个我们先做一个了解,好吧,一个字典表。那我们后面也有个例子,可能会用到一个简单的临时呃字典啊临时字典,那还有一个这个就其实咱们前面也讲了一个总原则,能提前过滤掉数据的提前过滤,包括咱们前面所谓的位置下推,是不是也是希望提前减少数据量,对吧?那你也可以你要主动去加,对吧?包括什么呢?咱们前面提到的什么列裁剪,分区裁剪,也就是说字段选,你想要不要全选分区呢?选择你需要的分区,这些不管是什么,其实咱们就一句话呗。
09:12
提醒,减少什么查询的数据量?Have是不也一个道理啊,你想想那些所谓的优化是不是都在想方设法减少数据量,对吧?这是一个总原子啊总原子。嗯,好,那我们现在一起回顾一下,多表观点,关于这一些,你应该总结出什么?来,我们稍微敲两句啊。就CK的,就首先你需要知道这么一个景点啊,首先它的原理是什么,右表加载到内存对吧,然后再去匹配。好,第二个为什么就用不行。
10:07
呃,老师说他不行,因为一。对吧,是因为它的原理嘛,对吧,好第三一个那有一些非要使用注意事项。怎么用比较好?呃,其实就把那几点综合,能过滤先过滤对吧,能过滤先过滤特别是什么右表对吧?另外我们注意右边放小表,这些都差不多意思,然后第三个,呃,特殊场景可以考虑使用时间表,其实你想想如果数据量不大。你这个表在那也无所谓嘛,对吧,你长度内存也提升不是很大,因为本来数据不大,我读一下。
11:06
又不会打的。还有一个呃,可以替换的话。尽量不要用旧音,比如用in来实现,对吧?当然印不是万能的,不是万能的对吧,某些场景才可以替换。这是咱们要知道的几件事。嗯。
我来说两句