oracle数据库菜鸟教程 sqlserver日志查看( 四 )


幸好,在SQL Server实现并行运算的运算符”nestloop”与之相似 。上篇中并行nested loop join的原理中已经提到 。
并行Nest loop Join实现方式
在并行循环嵌套中,外表数据Scan,seek多线程(threads)同时进行(Map),而内表的在每个thread上串行执行(Reduce) 。
优点:

  • 可以减少执行过程中各线程数据流的数据交换
  • 显著的减少内存需求
上述查询我用如下的方式实现:

oracle数据库菜鸟教程 sqlserver日志查看


执行中输出实际执行计划可以看出,此计划中消耗的内存15MB,和上述的执行计划相比有指数级的下降,同时执行时间为不到2s,保证执行时间的同时明显降低了资源消耗,从而避免了实例级的影响 。
已经很美好了:)
如图7-3:

oracle数据库菜鸟教程 sqlserver日志查看


图7-3
到这里其实我们已经达到了我们想要的效果,但还可以更好吗?我们还需要多了解些 。
上面我讲到了并行nest loops的优点,少资源占用,少数据交换 。但就像在我以前的文章中说的那样:”任何术都是有缺陷的”,前文已经提到了并行中很可能造成数据的倾斜,如上图7-3中蓝线中标注的外表seek,实际是只在一个thread中完成的 。优化器为我们加了数据交换,使得外部的数据在多个threads下分布均衡与内表匹配提升效率,但优化器可不会每次都如此“好心”(智能) 。
其实在并行seek,scan中由于实现方式在05到08的过程变化很大(前文提到过),使得操作更需注意,这里我们直接上新的方案 。

oracle数据库菜鸟教程 sqlserver日志查看



oracle数据库菜鸟教程 sqlserver日志查看


通过查询时输出执行计划 如图7-4所示 。
我们可以看到通过将外表数据放入临时表中,使得内存消耗进一步降低,而数据较为平均的分布到多个threads中,你可能看到其中不少threads是没有数据的,其实有时需要我们根据查询管控并行度的 。而在执行时间上有可能得到进一步的改善!

oracle数据库菜鸟教程 sqlserver日志查看


【oracle数据库菜鸟教程 sqlserver日志查看】图7-4
至此,还有没有更好的方案呢,当然有,优化器就是让我们玩的!
我们可以通过临时表缓解数据分布不均的问题,但临时表创建导入也是成本啊,我们也可以用其他方式诱导优化器让数据分布彻底均匀,还记得前面说的Round Robin吗?这里我用特定的写法引导他的数据exchange.彻底平均分配,

oracle数据库菜鸟教程 sqlserver日志查看


如图7-5:

oracle数据库菜鸟教程 sqlserver日志查看


图7-5
至此这个优化更合理的解决了面临的问题!
我们的并行原理及实践也到此为止吧 。
说点题外话,不少朋友认为SQL Server是小儿科,没内容,技术含量不高,而且在国内的互联网公司中又显得格格不入 。这种想法真心Too Naive 。这里我可以告诉大家,SQL Server,乃至关系型数据库的水很深 。如果你是相关的从业者,全身心地投入进来吧,其实很好玩 。

推荐阅读