00:00
先来看一个动态切换交策略。啥意思呢?简单来讲,咱们常规是不是S,呃,Salt。交易呢,对吧。那么它在一些情况下能够自动帮我们调整就策略。比如说转换成广播就。其实这个东西跟咱们前面讲CBO的时候一样。啊,大家可以回忆一下,当时呢,咱们两张表进行纠,但是我的SQL语句里边对其中一张表进行了一个过滤。那过滤之后它的值已经是小于十兆了。但是呢,如果不咱们不开启C的话,它会干嘛呢?它会用原始大小表的原始大小来判断是否满足广播的条件,然后呢,即使是这种情况,他join还照样走什么salt me。对吧,那当当时呢,咱们开启了,咱们做了表跟列的信息统计,在做了一个CPU功能的开启之后呢,它会根据实际处理后的数据大小去判断,呃,我们发现这种场景它能走什么广播交易。
01:10
那其实咱们这个动态切换交易策略跟这跟咱们之前这种方式就特别特别像了,只要开启它,那它就不会再按照原始数据的大小去做一个呃,去做一个判断了啊。那我们看一下这个代码啊。在咱们AQE下面的这个动态Switch join里边,那这边核心逻辑是下面这个查询出两张表,那这张表原始大小是二个多G嘛,啊不考虑列式存储跟压缩,那这一张呢,是四个多G。那如果是常规的join,他们应该是一个,呃,Salt me join,但是呢,我在这做了一个过滤。啊,它的all的ID指定为这一段,那指定完之后应该是在八兆左右剩余啊,剩余八兆过滤完,那是不是小于咱们的广播阈值十兆啊,对吧?那么如果咱们没有做任何优化,我把这些参数全关了,那这个时候呢。
02:13
他是不是按,虽然咱们做了过滤啊,但也没有用CBO,它是不是按照表的原始大小,这张二个多G,这张四个多G来判断,他判断他俩呢,不需要用。呃,就是说不能走广播交引对吧,那如果开启了这两个参数呢,它就可以按照过滤后的真实大小。呃,然后去做一个对应的判断,那我们说八兆小于十兆,它是可以走广播交易,那我已经打分别打完包啊,就是都不开参数提了开。提交也都提交过了,那我直接看一下历史服务器。好这两个,那下面这个是开的,开参数的,这个是不开参数的,我们先来看一下。
03:03
看一下不开参数的吧,啊来点。直接看circlele执行计划,再点开,点开之后呢,前面都扫表扫表扫表,哎,然后是不是要进行一个沙uffle杀,Uffle完之后,你看他们走的啥呀,Salt Mar。来,我把这个截个图啊。把它截个图,截完图之后咱们回过头看倒数第二个任务我提交过了,打开两个参数再重新打包提交的啊,直接看circle。点执行计划。那么大家注意看了,还是这两张表啊,呃,Cos配跟csc还是这两张表,但这有过滤对吧?呃,而且之后呢,他杀否现在多了一个什么,多了一个这个。自定义的杀否读取器啊,自定义杀否读取器,那读了之后呢,你看。
04:02
这边也是用了自定义否读取器,那这一个的作用就是真正的判断我否之前需要交换的数据量是多少,对吧,那看这前面他其实已经知道对吧,才1000多行数据啊,没那么大啊,肯定是小于那个大小的。最原始,你看最原始是不是50多兆啊。啊,这个是90多兆对吧?啊啊90多兆是因为用了压缩跟帕啊好,那再往下你看它走的是什么广播交啊这个就有区别对吧。我缩小一下,大家看区别就在这儿啊这一块。这一大块。这就是他自动帮我们切换的一个join策略。而且是没有做CPU,没有开CPU也可以实现这个功能啊,开CPU也能实现类似的功能。这个就是动态切换策略。
我来说两句