00:01
接下来我们看一下第四章的一个内容,查询优化,那这一块呢,就是除了click house r Bo给我们准备好的一些优化之外啊,我们平时查询的时候要注意一些什么事啊,也就是说用法使用上怎么样效果才好一点啊,那首先我们分两大块,第一块呢是一个单表查询,也就是说你ne flow1张表这种场景应该怎么写啊,另外一种多表关联,就两张表要进行一个Q,好,那么现在问题来了,大家觉得哪个用的频率会高一点?一个是做交,一个是单表查询。哎,对,没毛病,单表为什么呢?因为从咱们项目架构来讲,一般肯house是不是存宽表更好一点啊,对吧?好,那宽表是不是大部分场景咱们查班表就满足要求了对吧?个别情况实在是业务需要,需要交易,那无法避免对吧?但是并不是说不能做啊,只是说他的话可能还麻烦一点啊,它比较奇葩,那我们先来看一个单表查询,首先第一个他们的click house是不是有一个语法顾虑,咱们通常是用where对吧?那它有一个叫pre well。
01:26
好提前过滤,那这两个我们先了解一下它们的区别。首先它有限制啊,它有限制,它只能用于合并数的引擎,也就murder tree Mo tree有很多个吧,对吧,它只能用在Mo tree,其实大家发现很多功能,很多语法都只能支持合并数啊,那么那它俩有什么区别,它也是用来做过滤的呀,它是这样,比如说你写了一个语句s select from,然后prevare啊,比如说某个字段A吧,A怎么样,大于多少。
02:05
那这样子的话,你想想常规咱们一个数据库执行这个搜索会怎么走啊。咱们是不是假设这里有一行满足我过滤条件的A字段,满足条件的有。10万行,那他是不是应该首先把这10万行给怎么样过滤出来。对吧,他找到这10万啊,假设这里是10万当啊当然不一定在一起,对吧,然后呢,再去选择咱们需要的select的字段对不对,因为我咱们宽表是不是字段很多呀,少则大井十,多则几百,那像咱们官方案例是不是都100多个字段。难道你每次查询都要所有字段都出来吗?也就是说它的步骤是这样,第一步过滤出满足条件的行,第二步选出需要的列,是吧?这种是普通,Where,那prevail呢?它不是这样。
03:08
它结合咱们分析型语句的一个特点,咱们是不是关注列啊,而且它本身是列式存储,它是这样,你不是要过滤A吗?好OK,我找到A这个字段。再来呢?我过滤出这一部分。A,是不是有10万行满足啊,大家注意,我不是整行查出来啊,我只查这一列,之后呢,再根据你select里边,比如说你需要了BCD3个字段,一共100多个,你只差三个,然后呢,他根据你要的字段把这10万行补全,这样少了什么其他无用字段的扫描对不对?它提高就提高在这里,它不是整行给你读出来,它不是整行过滤出来,能理解吗?这就是prevail效率更高的地方所在,对吧?所以呢,咱们一个原则,如果能用prere,咱们就用用prere。
04:11
效率会更高一点。好。那这样的话,嗯,如果你要简单跟别人描述,除了这么讲,还有一个就是可以什么,那是不是同样降低IO了,我读取的数据量是不是其实变少了呀,你不用整行读了嘛,对吧?好,那那既然它这么好,为什么默认不用它呢?其实大家可想而知,如果他能完全替代威尔,那我干嘛还要威尔呢?对吧,肯定是有个别情况还是没办法啊,个别情况没办法,当然呃,他也考虑到这个方式好,他也会帮我干嘛,自动优化,就是大部分场景咱们的where都会被自动优化成previvail,那比如说咱们这边有一个例子啊,咱们先看我这边只是简简单单挑选了这张表里的底,呃,应该是30个字段吧,呃,我选取了30个字段,然后呢,做了一个过滤,喂,是普通的啊过滤谁啊用户ID。
05:21
好,那么接下来我试一下。我看看他会不会。你看变成什么了,它自动帮咱们优化啊。你看上面的语句是,这是大部分场景能满足的,但那这个东西自动能不能把它关闭啊,不让它自动啊,效果更明显一点,就咱们跑这个啊。
06:02
这个参数我把它关掉,这个参数其实大家看一眼优化对吧,变成默认值是一表示开启,零表示关闭,那我把它制成零先好制成零,接下来我刚才的那个执行优化语法的,我再把它跑一遍,你看。是不会帮咱们优化好,那么现在这种场景,我们分别来真正的执行一下,查看一下效率,哎,我拉到前面把执行计划删掉,让他跑,呃,这个应该会卡一会儿吧。好了,152行,满足条件用了三秒钟左右,啊,把它截个图,呃,那么接下来大家应该知道我要干啥呢,对吧,我用pre跑一遍。哎,怎么老带一个W。
07:05
哦,我按到的那个银色的是吧,那没事,好回车看一下有没有快一点,有没有快一点。差了多少倍啊,你至少肉眼可见的是五倍左右吧,对吧,好,那咱们现在这样,我们再来玩一个,我把这个优化参数继续打开。改为一,那我执行普通的V现在是where对吧?那么大家觉得执行完需要多久呢?大概是三秒呢?还是零点几秒,零点几秒来我们试一下对吧。就是一个优化特别明显,因为咱们有数据集啊,演示一些现象就很方便了啊,那这些语句你在官网同样可以跑,因为是查询语句啊,这个他都可以跑,大家在上面跑就行。
08:03
那既然如此,你生产环境会把这个参数关掉吗?啊,对啊,不要关啊,那什么情况它不能自动优化呢?来下面总结了几种情况。常量表达式。还有一种特定默认值为这个类型的字段。这个在其他库这种你可能用的比较少啊,那比如说包含了这种global in global not in这种它没法pre。还有一个查询的列字段跟V的位置相同,什么叫位置?过滤条件的那个字段就是位置吗?对吧,比如说你that a from什么,然后where a等于多少。那这种其实这种你推不推。
09:01
差不多吧,其实咱们可以试一下当前版本,因为最新版在最新版啊,比如说我把这些全干掉。哎呀,这真不爽。哎。我这样。哎,哪去了语句呢,这个是吧。我放到这儿来,然后把这些全删了。ID。咱们加一个是YTS,看一下能不能优化啊,能吗?我现在那个参数关了没有,没关你不信,你不相信我可以,我再强行强行设一遍,是不设为一啊,你看这就是其中一个条件,顾虑的位词跟查询的位词一模一样,大家注意不是包含啊,不是说你这里写了三个字段ABC,这里写的A它就不行了,而是说仅有一个字段完全相同。
10:15
其实我刚才那么多知道也包含了UID的,也包含了的,你看。这我就会了。好,那其相应的还有一些。使用的主键字段组件字段是哪里啊?O的对吧?BY那有的同学疑问呢,我建表的时候这个不就是组件ID吗?但咱们对他做了什么呢?哈西,对吧,你不信你用class ID再跑一下。呃,不是class,好像count ID表语句。在那个搜口语句里面都有嘛,你可以在这瞅一眼嘛,它里面的order by字段啊。
11:00
是那三个可以再去玩一玩。所以呢啊,我们来总结一下怎么来用,所以你以后未来用click house去写的时候,你是相信他,让他自己来,还是你手动指定好一点。对,手动指定,因为刚才咱们列的几种情况,就算呃,不要求你完全记住,你就知道有些场景,有些条件它没法自动帮你转换,但是手动指定是可以的,这可以生效的,所以你就习惯性的就过滤条件,你就写它就行啊,习惯性写它这是一个preview,那还有一个数据采样,这个就比较简单了。咱们有时候分析某些指标,不要求完全的精准度。也就是说我不是全量统计,我只需要采集一部分的数据,比如说我有亿条,我只想拿其中100万条拿出来统计一下,看一下情况,这种可不可以呢?可以,他可以支持一个采样操作,诶咱们have什么支持采样?
12:08
28个人申报好,那have呢啊,对它本身分筒是不是支持采样有两个参数嘛,X跟Y还记得吧,那他就比较直白了,你看查询的时候跟上一个什么。Simple,零点一百一就是百分百,0.1就10%。来,把这句拿过来,在这把注释去掉。咱们过滤了一个count I dv57,就其中一个,这是我找的一个数据啊,然后在这些数据里面,我只要取其中的10%,或者一个什么count。那就无所谓了啊。我只展示了1000。
13:05
77。啊,这个是数据内容啊,这是官方提供的,我也看不懂,我也看不懂,这什么语言呢?阿拉伯还是俄文还是语俄语吗?大家这么秀的吗?原来大家都认识,就我不认识啊哼,那我们现在干个啥事呢?呃,比如说我把这个sample去掉,我们再看看原始效果是怎样,一定是十倍吗?我这个是不是做了一个countt,我我去掉海样0.1是不是变成是变成这样吗?不一定啊,你采样是指不定他咋采。那分组数是不是变多了,它是先抽数据再去统计啊,先抽出来再统计,这是采样,就方便了解一个数据的情况,你也不需要做一个全量图,那这种什么时候好用啊,你并不纠你跟谁倾斜,你也不走mmr也没有杀Le啊,但是有一种情况可能会杀Le,但也不完全杀Le是啥呢?咱们是不是有个分布式表啊,分布式表进行join的时候是不是得杀否?
14:22
类似沙数据交换嘛。对吧,只有这种时候会啊,其实我不太推荐分布式表,你想想你单节点给那么大的资源。对吧。其实分布式表它最终也是变成本地执行。每个地方广播一份。然后在本地进行交易,底层也是这样,你还不如一开始就用一个什么本地表。对克house而言,你就不要想着什么分布式,它不是这种设计思想啊,不是。采样主要是咱们了解一个数据情况,分布情况,就像你你你是要要摸个底对吧,估算一下,但是不不一定完全准确,我随机采样,就像你工厂嘛,你一批数据合不合格,你是不是抽其中几件代表性的样品出来检测一下,你不可能所有的产品你都把它检测一下,那还怎么卖啊,卖不了。
15:23
这叫采样吗?采样?嗯。这就介绍个用法啊。同样。
我来说两句