(function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();

理解SSIS中的Pipeline

Categories: SQL, SSIS, 未分类
Tags: No Tags
Comments: No Comments
Published on: 2011 年 01 月 13 日

自从SQL 2000以后在SQL Server上SSIS就成了一个非常重要的产品。相比DTS,最大的变化不是在那些转换的控件上,而是运行体系,清晰的运行方式让开发人员可以更加深入的理解任务和数据的关系,能够将整个数据集成的项目清晰的分割成不同的阶段和任务。新架构下产生了Data Flow和Control Flow的概念。这次就重点聊聊Data Flow,希望读者们能慢慢理解其中之精髓,不明白的可以留言。(通常情况下我太愿意贴图,因为之前就没学会怎么搞图片)

Data Flow中文就是数据流,实际上Data Flow数据Control Flow中的一个任务。一个SSIS包中可以没有Data Flow但是不能没有Control Flow,例如SQL Server中的维护任务就可以是一个SSIS的包,用来备份数据或者维护索引,这种包就没有Data Flow。Data Flow主要适用于处理数据,在Data Flow中,数据从源读取写入目标,中间可以根据数据要求进行转换(结构,内容或类型)。数据从源到目的过程中,完全都是在内存中进行转换,也就是说一旦数据进到了Data Flow,在硬件上就只与内存、CPU缓存及CPU打交道了。Data Flow是依照Pipeline模式进行设计的,也就是说数据操作可以理解为逐行处理。当然数据读取和写入还是和这些数据源或目标有关系,可能也会有批的操作,但是转换上只能在内存里面逐条进行(部分操作除外,后面会提到)。如果是Pipeline模式,硬件上就需要有更快的CPU及内存的频率,这些对于性能来说很重要。但是如果不做特殊的设计和处理,系统很容易达到一个瓶颈,因为每一个pipeline只能够理由一个线程来操作,无论你的服务器有多少个核,只能发挥1个核的作用。当你发现其他的子系统压力也不大,但是SSIS转换的速率却不高的时候,基本上都是这种问题所致。

另外在由于数据通过pipeline中进行流动,如果有一个转换将所有的数据堵在内存里将极大的影响SSIS运行的效率,而且如果数据量非常大的时候可能会把内存耗尽,就像北京堵车一样,没有事故还可以,有了事故就全线飘红。SSIS可没有TempDB,物理内存没了就是没了。这种情况基本上都是在聚合组件和排序组件上,所以要尽量避免使用他们,除非万不得已,否则小心使用。

这个问题我觉得对于一般的开发人员来说不是很好解决,如果你对数据库及SSIS没有很深理解的话,基本上很难,而且这个问题是无法通过升级硬件来有效解决的(目前CPU的发展并不是高主频,而是更多核)。这个问题只能通过设计来解决,但是这可是一门学问,涉及的领域就是并行处理。并行处理需要考虑很多问题,包括数据源和数据目标的设计,控制流设计等。通过这些巧妙的设计,让我们的包能够通过更多的线程来运行更多的pipeline,当然这个更多2字并不是代表无穷多,因为当线程数量达到一定规模的时候,整个系统的瓶颈可能就会出现在其他的子系统上了,多数情况可能在网络IO或者磁盘IO上。

设计并行的SSIS包比较复杂,这里我给大家介绍一下RRD(Round-Robin Distributor)。这个组件目前还没有发布,但是可以讲讲这个组件的实现方式。实际上这个组件就是将输入pipeline根据你的data flow下层引出的执行线程数量动态的分发数据,这个功能类似于多播,只不过多播里面分发的数据是相同的,对同一条数据复制了多份并产生多个执行的线程,RRD上分发的数据是不同的。这样如果结合上适当的数据源就可以在data flow中实现并行。如果哪位在项目中需要使用可以联系我。

最近在和SSIS产品组交流的时候,我也提了一些建议,主要都是和性能相关,他们也应该与时俱进一下,让用户能够更好的利用一下多核。

No Comments - Leave a comment

Leave a comment


Welcome , today is 星期六, 2017 年 06 月 24 日