00:00
Runtime filterat运行时过滤,这是在DOS0.15版本加入的一个新功能,那主要是呢,呃,他帮我们做了一个自动优化,目的呢就是减少一个扫描的数据量,这样呢就可以减少IO,还有网络传输,那这样整体而言我们的查询就能够进行一个加速,那跟位置下推有点像,但又有点不一样啊,我们具体来看一下那。它是在查询规划时生成的,在哈希node中去构建,那这种在执行计划里面我们是能看到的,对吧?那举啊我们看这个例子,现在有两张表,T1跟T2,比如说T1它有10万条数据,T2呢只有2000条数据。那我们可以看到的扫描情况就是这样对吧?啊,它分为两个阶段,第一个呢,就对它进行一个sc node,然后之后呢,是哈奇join node,那一开始呢,这两个环节,这边10万,这边也是10万,这边2000,这边也是2000,对吧?这是我们直接来理解的情况下,但是如果我们能够提前过滤啊,什么场景呢,由于T2数据量小,它是比较快啊,哎,就看下面那张图。
01:12
如果我能先把T2这张表给扫描出来,T先不扫描,等T2扫描出来这2000条数据。是不是把T2的结果当成一个过滤条件,从T1的10万条数据里面把它筛选出来,比如说呃,本身有10万条,然后T2的查询这2000条,我当成过滤条件,对这10万条数据先进行过滤出来,那是不是可以减少数据量,那这边的例子就比如说啊,过滤完之后T就剩6000条了,那回头我们做灸的时候,是不是只需要6000条跟2000条做处理就行了,那这样效率不就提高了吗?对不对,但是呢,大家可以看到,他一开始是不是还是得读这10万条,从存储的地方先把10万条读出来,读到这10万条再去过滤。
02:03
这还不够优化啊,再往下看,如果我们能够将这个过滤条件下推到哪里呢?存储引擎一开始读的时候,我就不要读10万条。对吧,我在一开始扫描数据T1,你就没必要说10万条先扫描出来再过滤呢,我们某些情况下可以利用索引来直接减少我们数据量,那这样是不是更理想更好啊,对吧?那这种机制是什么呢啊。叫runtime field,它是运行运行时动态生成的过滤条件,这个就是跟我们以前呃各种呃框架理解的位置下推还有点不一样,它是更进一步啊,传统的位置下推可能就是这种作用方式,你一开始还是要去呃先扫一下数据,然后再过滤,对吧,那现在呢,我直接从一开始就给你过滤掉了。这就是run,那这个事呢,一般是自动帮我们处理的,那它有好几种方式啊,那我们看一下下面啊。
03:09
还有一个就是它主要针对于大表的就进行优化,因为你要过滤数据嘛,如果你特别是左表啊,左表数据量比较小,那你这个效果就看的就。差距,差距不是很大对吧。好,那我们看一下吧,首先了解这么一呃,我们简单来感受一下,首先有一个变量是这个runtime fear type,它这里面有很多种选项,有很多种方式,这个是什么意思呢?就是说你看我们run是不是先扫描出小表啊,呃,然后T一开始从存储引擎读的,读的时候是不是就开始过滤了,那过滤有很多种方式啊,有一种叫最大值,最小值。那比如说我这边的值是一到三。啊,或者咱们举个其他例子,十到20过滤出来是十到20,比如说有个ID值。
04:01
那我在T1去扫描的时候,我怎么扫描,我是不是将小于ID小于十的跟ID大于20的这些数据直接过滤掉,对吧?也就是说传过来的过滤条件是一个最小值跟最大值。啊,根据这个来过滤,那除了这种之外,还有其他的一些,比如说范围的用in,还有一个布隆过滤器的啊。对吧,这个就是指定我们过滤的方式,过滤的类型叫runtime fair,然后type来我们来看一眼,到这里我直接收variable。受as在这里呢,我们统一看一下关于运行时过滤的啊,主要有这么几个参数。那其中最核心的我们经常修改可能只有G,那么大家可以看到现在默认的是什么in啊,是一种范围过滤对吧,也就是说类似我们SQL过滤条件的in一样啊,我的条件是在这里面in,那么其他还有很多很多对不对啊,像比如说大家可以看到关键词什么max啊,Max对吧,这种就我刚才讲的最大值最小值之内的一些参数。
05:13
还有什么用不能过滤的方式,它也也有几个参数啊,那总而言之,对我们最重要的就是这。不能过滤太,那现在呢,它也可以同时指定多种啊。来比如说我这边设置成什么,既有不能过滤的,也有硬的,也有最大最小值的方式,来我们看一下,我set一下。好,再来show一下,你看这个type是不是改掉了啊,用逗号分格啊,如果要多种方式,好,那接下来呢,我们建两张表,这两张表就很简单,就一个字段啊,Int类型。然后呢,根据这个字段做一个分筒,没了,没有什么任何特殊的处理啊,好,这一张最普通的表。
06:03
啊,还没选择库对吧,Use test DB啊,啊见表,然后呢,插入一条简简单单的数据几条啊就一个字段int类型嘛。好,那同样再建第二张表。啊,暂停。拷过来直接快速的插入就好了啊好了,看一下新from test1。诶,我们那啊叫test是吧,啊test你看就这么几条数据,查一下TEST2啊,这就是两张表啊,超简单,好,那么接下来我们看一下他们究引时候的一个执行计划啊,就很简单,按照这段观点,然后揪。看执行计划。看哪里呢?看这个join这里啊,前面我们讲几种join方式,是不是一直看到这里啊,还有这个地方对吧?啊,其实你再往下看,还有一个东西叫run Fi。
07:10
啊,这一行,那你可以看到他现在用的是什么。Run rf就run Fi嘛,对吧,那这个是in,用in的方式,那还有呢,用布容的呃方式,还有呢,用最大最小值的方式,那为什么会有这么多种方式呢?是不是因为我们type类型指定了好几种。对不对啊,相当于说我们这几种都用上了啊,都用上了。那这个这个就可以看到我们,呃,Runtime有没有生效啊,而且呢,用的是什么类型,你看这个中括号里面的就OK了啊,而且呢,是通过哪一个字段来过滤的啊,也都有。那这是我们从执行计划来看啊。
08:00
我们也可以通过DOS提供的profile来查看一个它的执行效果,比如说这个enable profile这个参数啊,我们看一下啊,So variables。呃,我直接在这里找吧,因为也不算多,对吧,你看这个默认是false。啊,默认是false,我我设一下。拷贝set等于two,那这样就打开了它的profile功能啊,那接下来我们直接执行这个语句就可以了。好。那怎么查看profile呢?啊,我们这个功能开启,你在命令行这边是看不到,但是通过web UI是可以很方便去查看的啊,我们当前连接的是哈杜一这个节点的F1是吧,那我们直接来打开一个网页,呃,哈DOER1啊,然后呢,8030对吧?打开它的web端口,那这里我们顺便回忆一下啊呃,Fe web的端口是8030对不对啊,那be的web端口是多少呢?是不是8040对吧?那现在我们是要在fe上面去看啊好,我回车。
09:17
我之前登录过了啊,所以现在没有让我继续登录,那我现在是用root账号登录进来,那这里有一个什么。Profile。点一下这里,那这边呢,就可以看到每个从你那个enable把它设为true开始,我们每一个查询语句啊,都会在这里生成一个profile,那么看一下点一下这个profile。点进来,那在这里我们能看到很多很多的信息,对吧,首先呢,主我们这个主要是看他的一些执行时长啊之类的。那我们在这里找,找一个那个运行时过滤对吧,那这边大家感兴趣可以去看看,都很直白啊,像什么。
10:05
呃,像。计划时间用了多久啊,分析时间用了多久对吧,调度时间用了多久,那下面就是每具体的每一个跟我们的执行对话是对应的,你看比如说这里啊。还有呢,哈希join的时候啊,交换数据的时候啊,这边都有,主要是CPU时间啊,这个profile主要是看的这个,那么再往下找呗,找找找,你看这里我放大一点。在这边你就能看到那个我们使用的runtime field,那这边这个语句我们是同时使用的三种。因为我那个type是不是指定了三个,那么大家注意,我这边只是为了演示,所以把三种都打开了,那正常来讲我们就用一种就行了,对不对,那可以看到它的什么耗时,耗时是不是差不多都是100毫秒左右。
11:00
是吧,那时间比较短的是不是这个m max啊,那这边有in类型的,还有布隆过滤器类型的,还有最大最小值类型的啊。那基本上等待的时间都是零啊好,那还有一个地方就是。呃,我们可以看这个op scnode里面有一个下推后的过滤效果,还有耗时啊,就看这个东西啊,Op scannode我们找一找。呃,O AP sc node。不过不是这个地方啊,呃,它有很多SC的对吧?啊,我们回到那个。布那个过滤的那里啊,在这里对吧,过滤的呃,我们直接往上看啊,从这个地方往上看,在这边呢,往上翻一点,你看这个是不是一个or AP scde对吧?啊,你就找到对应呃,这个run Fi的上面去看看什么东西呢?看呃主要看两个,一个是Rose。
12:07
这是不是布隆的过滤效果,然后这个是润菌的效果,对吧。的效果在哪呢?就这一行过滤掉几个,还有呢,啊一个它的耗时就主要看这两个,当然我们现在数据量特别小,对吧。现在是零。看这个啊。过滤啊过滤后的,然后呢,这个是一个时间啊,那文档我也给大家标出来了啊。这是我们对于这个run Fi的一个使用。
我来说两句