00:00
好,那接下来我们看一下啊第二题,呃,第二级呢,就是说今天我们也聊了,当连接条件失效或者不存在连接条件的时候。对吧?嗯,那都会产生这个二级,在生长环境当中呢,是要避免掉这个二级的,在我们后面这个位置啊,严格模式的会有一个参数可以进掉第二级,我们后面再聊,然后接下来呢,我们看一看这个所谓的行列过滤啊,这是什么意思呢?列过滤大家比较清楚啊,在查询语句当中,我们只拿需要的列。啊,尽量的少的使用什么select星啊,尽量不要用select新,而且呢,如果你是分区表。对吧,尽量的在查询语句当中不要字段当中就干什么,按分区进行过滤掉,这是我们所说的叫列过滤,行列过滤当中的列过滤,对吧?只取我们想要的啊指是这个意思,然后再来呢,还有一个行过滤。
01:01
行过率什么意思呢?就是说如果说啊,假如说我们数据,我们看这张表来。看这个,呃,Select o.ID from big table1对吧,然后join big table啊,自己照自己,哎,这个呢,少了一个O是吧,对o.ID然后去照应自己,照应自己呢,然后看在外面去做什么事。说o.ID小于等于十。那我们能不能替换成下面这种写法?看这个这个在干什么事啊,CF的ID从O表当中对吧,提前先过滤出来ID小于等十的,然后去跟另外一张表进行交引。我们先做过滤,那大觉得这两种效率哪个高啊,看是不是第二个高一些啊,来我们运行一下啊,反正这个o.ID小于十嘛,所以说呢,这个数据量也不大。
02:07
哎,我是。啊对,这个还少了东西是吧,怎么缺了好多东西呢?啊对吧,这个地方呢,这个地方有的是吧?哎,把这个运行一下。就是测的结果,大家会发现到其实两个差不多。其实两个差不多啊,那你想想看,哎,我是一本来是100万的数据,我给他另外一张表变成了十条数据了,怎么还差不多呢,对吧,我们来看一下,稍等一下啊,这里边就讲到了在S当中的一个典型的优化点啊,十跟这这是多少的,呃,30秒吧,29对吧?好,那第二种我们来看它啊,其实跟之前之音也差不多,这是34啊,这是30,刚才29.244是吧,这个数据啊。
03:34
29.623是不是差不多啊,你不能说这个零点几秒说说说他们有差距对吧?啊其实差不多,那为什么呢?我们来看一下执行计划,是不是这个时候我们只能通过执行计划去看来对吧?好好,这里边呢,我们来看一下执行计划,把它我先拿一下,然后呢,X。好,然后呢,我们去把这个干什么粘出来对吧,放到这个位置,我把这个替换掉啊,这个东西呢,我也给它干掉,这个东西呢,都给它干掉,不不受影响啊,没有东西对吧,看到没站起来,这是我们刚刚的这个,呃,直接转之后坐标对吧?还有一个是不是先过滤,然后再去做VR呀。
04:30
到这。我们给他拿过来,好,那我们看他啊,哎,来注意看这表的扫描的时候。我们是不是V词段写在join之后啊,对吧,但是你看它在扫描数据的时候有一个过滤操作。他是还是先过滤,而对这张表,另外一张表是两张表,他也做了什么过滤操作。
05:04
他都先做过滤的,好,那我们看另外一个执行语句差不多对吧?好,那另外一个circle是怎么写的,对里边的big table这个字段进行什么。过滤另外一个O表相当于对吧?啊,对于我们的O表,这是别明取O表啊,取O表去过滤,好,那我们来看这个执行计划,首先B表是不是外面的表居然也能用。对吧,而O表这那毋庸置疑,它这张表我们肯定能用啊,因为我们写了,所以他们俩执行计划,最后join应的也就是互相小于十,小于等于十的数据在做什么在做join引,这个是S当中非常典型的一个优化方式,就是底层人家自己做的,叫一个名词叫为此下推。叫为慈为慈下推啊,它正常来说搜索当中它是个关键字,有自己的执行顺序对吧,会有自己的一个执行顺序,那么有可能我们知道先走所谓的什么from,对吧,然后呢,走什么join啊,根据join字段再走这个select查询,按照我们所聊的will,这个will写在外面,是我们想的,他应该最后执行。
06:28
对吧,但是你注意看啊,它这个will呢,是第一是我们单表当中的,不是衍生字段,如果说这个表假如说是你照应A表呢,有一个一列,B表有个二列,我在照应之后,我要形成一个什么结果呢?一列加二列。这个是所谓的衍申列,如果按衍申列过滤,不好意思下推不了,因为必须在转移之后我才能做过滤,因为你是join语的结果,对不对,而现在o.ID它是原表测算,他遇到这种情况下呢,它就自己能够做什么事的将这个数据。
07:09
鲜果。将这个数据先做过滤啊,我先给它过滤出来,然后再去做装引,这就是我们所说的叫位置下推,尽管你把V要写在后面,对吧?那我在转移之前,我能对这两张表呢都能做好。第二个问题,刚才我说了它居然对两张表都能做,那有同学说你这个写的o.ID小于等于十,那我知道对后面一张表呢,你去做过滤,我能理解对吧?位置下推你就推到这张表。它这个地方能对另外一张表也能够做被加对,是因为我们的状语字段跟这个字段是一样的。表啊,我们的状语字段跟当前这个数据字段是一样的,我们来举个例子,这个地方呢,我们找到最早的这个大表的参与句,我随便找一个字段过来,除了ID之外,我们B的是不是还有一个所谓的D啊,这个是时间戳啊,这个时间戳好,那我们到这来啊,行列过滤当中,你比方说我这个地方换成一个什么T,然后呢,我把这个拿过来啊,当然我们也不执行啊,我们直接看什么。
08:23
少了一个。哦,傻了是吧,我怎么换这个,应该换他吧,没有人提示我呢,你们也跟着傻了。那我们看看这个执行计划。来,呃B表,我们来看一下B表是哪张表,B表是不是这张表,我们最后o.T小于等于十。
09:03
是不是这张表啊,是第二张表吧,好,记住这个啊,那此时你看它还有T小于等于十吗?没有了,所以刚才那个ID能这样用的时候是因为什么,是因为join条件用的就是这个过滤条件啊,他在这个时候能做更更深层的优化,这个就做不了了,对吧?那你看这里边儿它有什么,它有两个过滤条件,一个呢是T小于等于十,同时ID不等于那。对吧,因为ID这个东西是不是我们状语字段呢,对吧,它对于状语字段呢,还有特殊的一个处理方式,这是另外一张表,O表是不是我们最终做过滤,这个就是O表,对吧,在这啊,也只有说在我们。是关联字段的时候,它能够推到两张表里边啊,如果不是的,那就只能指定到我们这一张表。啊,只叠到一张表,这是所谓的位置加堆,但是位斯加堆这种啊,是系统帮我们做的优化,它有时候呢,嗯,不那么靠谱,就有有时候你如说课写的特别长的时候,它会导致位置下垂失效。
10:09
它会导致位次下推失效,那所谓的失效呢,就是说在你正常交温之后,我再去干什么做过滤,那这种效率就低了,所以说大家建议大家生产环境当中写你还是怎么样还要写,因为就这种就相当于手动的再做什么位置下对是不是我们先自己手动给它过滤出来,然后再去做状语,能懂这意思吧,其实我们刚才看到这两个circle索,最后我们第一先执行的结果是不是时间是几乎一样的,一个29.6,一个29.2,对吧,几乎是一样的,那我们一看执行计划,确实啊,他把这个字段两个字段过滤字段应用到两张表了,对吧,那再做转移,两个都是小于等于十去做转移,那肯定效率是差不多的,也就生成的执行计划最终是一样的,对吧,最终是一样的。
11:01
啊,它是这样的一个效果,所以呢,这个里面我们给大家解释了,它是用到为此下推,这是它系统所做的优化,但是当我们S课特别复杂的时候,有可能导致位下推失效。这就需要我们自己在开发的时候尽量的干什么,自己加此查询的方式,自己手动的把数据集给他干什么降下来,如果说我们能做到降数据集的效果,是不是肯定先要去做一下,这是这样的一个效果啊好,这是我们结合着它的一个呃执行计划来看的啊,里边呢有个点叫为此下推啊,大家稍微关注一下,因为有时候面试的时候呢,他可能会提到这个名词啊,不要觉得特别特别陌生。
我来说两句