针对并行对您的 SSIS 包进行设计(SQL Server 视频)
适用于: Microsoft SQL Server Integration Services |
作者:Matt Carroll,Microsoft Corporation |
长度:00:12:37 大小:29.2 Mb 类型:WMV 文件 |
|
视频摘要
这个视频演示如何通过对并行进行设计,提高您的 Integration Services 包的性能。
视频致谢
感谢 Thomas Kejser 对 SSIS:性能设计和优化 - SQL Server 视频系列材料所做的贡献。本视频是该系列的第四部分。
感谢 Carla Sabotta 和 Douglas Laudenschlager 的指导和宝贵反馈。
视频技术说明
注意: |
---|
技术说明是视频的摘录。 |
并行设计由以下三个原则构成:划分问题、消除冲突和高效计划。
并行设计的理念就是将一个大问题分解为若干更小的独立部分,并且将工作铺展开来。对于 Integration Services,将问题分解为若干较小的部分意味着对要处理的数据进行分区。您要尽量使这些分区的大小相等,因为这样做可以大大方便最佳计划和分配的制定。
接下来,您需要消除这些更小的工作部分之间的冲突,以便它们可以并行执行且不会彼此干扰。您应该采用无状态设计,这意味着每个工作单元都是独立的,不需要与外部事物进行任何协调即可完成其工作。您还要减少对外部资源的争用。
最后,您需要执行这些较小的独立工作部分,并且铺展开来以便更快地完成它们。这意味着对工作进行计划和分配,以便高效地利用您的最关键资源。它还意味着合理使用时间,不让长时间执行的任务占据运行时。如果您推测工作的甘特图将要完成,则要让工作负荷均衡,以便全部工作尽可能早地完成。
划分问题
您要将源数据划分为若干更小的块区,其大小大体相同。您可以基于数据中的自然范围来进行此划分,例如按时间或地域划分。或者,如果您具有某一标识列,则可以将该列中的值作为模数,用来标识相等的分区。否则,您可以改为对键列应用哈希函数来生成分区。
除了对源表进行分区外,您还要对目标表进行分区,以便匹配源数据的分区。SQL SWITCH 命令提供非常高效的机制来添加和删除表的分区。
消除冲突
在对问题进行划分之后,您需要消除这些分区之间的任何潜在的冲突。采用无状态设计对于避免复杂的交互关系和可能发生的冲突十分重要。为了确保包在其设计中是无状态的,您需要向其传递完成工作所需的所有信息。
请确保避免锁争用。将许多连接插入同一个表终归会导致争用。为了避免这种情况发生,应使用已分区表并利用 SQL SWITCH。
要密切注意任何的控制硬件争用。如果问题出在磁盘 I/O 上,则改用更多或更快的驱动器。如果问题出在网络 I/O 上,则添加或升级网络控制器。如果问题出在 CPU 或内存使用量上,则在具有更多处理器或更高内存的计算机上运行,或者跨多台计算机运行。还要记住的是,Integration Services 设计为在内存中运行,因此,请确保每个包都具有足够的内存。
高效计划
在划分为若干更小的任务并且消除了这些任务之间的冲突后,您将要对这些任务进行计划以便高效地运行。为了创建高效的计划,从定义要完成的工作的优先级序列开始。SQL 表十分适合于此目的。
然后,启动您为完成此工作而已生成的包的多个副本。为此,一个简单而高效的方式就是使用 Windows START 命令调用 dtexec.exe。您启动的包数将确定您将采用的并行度。
然后,上述每个包都将基于优先级来处理任务队列中的工作,直到没有要完成的工作。包内的循环首先从优先级队列中获取一个任务,然后执行该任务定义的工作,再重复这一过程直到任务队列为空。
演示
在首次运行演示时,每个任务都按顺序由单个包实例进行处理。
在第二次运行演示时,两个进程并行工作。这些任务在由两个进程构成的批次中完成,演示的运行总时间缩短了大约一半,从 64 秒缩短到 36 秒。
在第三次运行演示时,四个进程并行工作。单独任务的运行时间从 9 秒延长到大约 14 秒。但总运行时间从约 36 秒缩短到大约 28 秒。
在最后一次运行演示时,八个进程并行工作。因为所有任务同时工作,所以,每个任务的时间延长到约 27 秒,而总运行时间与四个进程的总运行时间几乎相同。这里发生的情况就是遇到了磁盘 I/O 瓶颈,因为所有八个处理器为了从磁盘读取其数据文件而彼此争用。为了解决这个问题,我们要将这些文件分布到多个单独的磁盘和控制器上,或者改用更快的磁盘技术。