00:00
好,那接下来呢,我们看一下,从第六条开始,我们说过,它应该是一个多表查询啊,呃,一般来说呢,通常都是一些join啊,第一个CPU优化,CPU优化呢,它是一个成本优化器,在我们做join的时候呢,它尽量的去选择最优的方案来解决我们的问题啊,来解决我们的问题,OK,那在这种情况下来说呢,呃,一般来说它默认是开启的,我们也让它开着它会。尽量的去减少我们的一个成本啊,这是一个非常重要的一个优化方式,从0.14开始就已经带来了一个成本优化。啊,产品优化,而且默认就是开启的,所以呢,我们不需要去做它的一个太多的一个处理,对吧?好,那第二个点叫位此下推。啊,问宾,它是这样的一个语句。参数啊,默认呢,也是说像有很多优化的默认的都做了这个事情,好,那我们来看一下,呃,所谓的位词下推是指的什么意思呢?那么在S里边呢,我们往往有这个will with。
01:07
有will子句,那在这个当中呢,它会尽量的将well子句提前执行,因为一旦well子句提前了,接下来处理的数据量是不是就会大大下降?对吧?啊,所以呢,我们可以看到这个点,那接下来呢,我们来设置一下这个值啊来首先我们看一下默认值在这个位置。粘贴。就行,哎,默认的呢,我们看到它就是为触,也就是说是一个打开的现象,那接下来呢,我们看一下这个。执行的一个搜索语句,首先我们看一下查看执行计划就好,然后这个地方呢,我们是select的o.ID from table啊,Big table b,然后呢,Join自身对吧?啊,然后呢,我们写的是b.ID等于o.ID为o.ID小于等于十,看上去这个circle是不是应该在我们执行完join以后才会去做到位下推,也就是说才会去做到过滤条件。
02:07
执行,但是由于位置下对开的,我们看一下当前这个四个语句。来。执行一下好来看到这个当中啊,在这个当中呢,我们能看到在map阶段,它就做了一个什么事呢,ID小于十的处理,因为这并不是这以后才去做。过滤啊,才迅速过滤好,那有同学可能想到了,那我能不能将位置下推给它关掉呢。我已经将位置下推做赢了。关闭对吧?Force好,重新查看执行计划,发现什么问题,位置下推依旧生效。那有同学说我们这个被塞有什么用,大家注意,我们刚才提到了一个叫CBO的优化,对不对,那CBO优化默认就是柱,那我们同时它是在照应过程当中,它尽量用代价最小的执行计划。
03:08
来替代掉我们之后的执行计划,也就是说它是一个更高级更高层的一个优化方式,会复写掉我们其他的优化方案啊,所以呢,我们在未置家庭关闭的同时,也需要将当前这个指为false,那么在这种情况来说,我们来看一下。我们的执行计划。好,那在这种情况来说呢,我们能看到的点是在于它只是在join的时候呢,我们的ID不等于,那并没有小于十了,对不对,并没有下推成功啊呃,也就是说我们把位置下推给它关掉了呀,对吧?那什么时候去做过滤呢?来看到我们在这边reduce reduce作用以后得到的结果,再去做过滤,也就是说在两个表转完以后再做过滤。
04:03
那你想一下,在照应的过程当中,是不是会有大量的数据啊,对不对,所以呢,呃,位此下推,这是一个非常关键的一个点啊,我们可以将will子句提前运行,因为最后呢,反正这个数据我们都是要过滤掉的,那么我们提前过滤掉,减少join当中的一个数据量,从而优化我们的circle啊,当然除了我们V这种方式之外,其实我们还有另外一种方式,用这种方式来联系啊,当然现在呢,呃,由于我们加了位置下推,这个呢,就没有什么必要了,对吧?因这个我们可以看一下是手动去。做一下。位置下堆这样的一个事情啊,当位置下堆你发现这个内容失效的时候,完全我们可以用子查询过滤的方式来代替,直接写V要子句。对吧,这是一种替代的方案啊,但是一般在生产环境当中呢,我们的CBO优化以及位置下的优化都怎么样都会打开。
05:10
啊,那只要在我们CPU优化以及位次下推优化都打开的一个条件下,那我们确实能够看到它可以去做到位下,对在map阶段就能够将我们数据做一个过滤啊,因为我们是两个表要做join语,所以呢,它有两个表的sky map扫描两张表,然后在reduce呢做join操作。啊,那后面呢,就不需要做过滤了,因为此时呢,我们数据量就很小了,对不对啊OK,这是我们所看到的叫位置下推非常重要的一个优化方案,它指的是将为要子句呢往前移。提前过滤数据集,减少照影过程当中发生的数据量啊,这是为此下推,OK。
我来说两句