在企业中优化您的 SSIS 包数据流(SQL Server 视频)

适用于:Microsoft SQL Server Integration Services

作者:David Noor,Microsoft Corporation

长度:00:15:50

大小:68.1 Mb

类型:WMV 文件

观看此视频

相关帮助主题:

CAST 和 CONVERT (Transact-SQL)

如何为查找转换创建和部署缓存文件

如何在完全缓存模式下使用缓存连接管理器来实现查找转换

改进数据流的性能

表提示 (Transact-SQL)

TRUNCATE TABLE (Transact-SQL)

了解同步和异步转换

相关文章和博客发布:

Scaling Heavy Network Traffic with Windows(使用 Windows 调控高网络通信量)

Top 10 SQL Server Integration Services Best Practices(前 10 位的 SQL Server Integration Services 最佳实践)

The Data Loading Performance Guide(数据加载性能指南)

其他视频:

测量和理解您的 SSIS 包在企业中的性能(SQL Server 视频)

理解 SSIS 数据流缓冲区(SQL Server 视频)

针对并行对您的 SSIS 包进行设计(SQL Server 视频)

视频摘要

本视频演示如何改进 Integration Services 包中数据流的性能。在这个视频中,您将学习如何优化数据流的以下阶段:

  • 提取
  • 转换
  • 加载

您可以在设计、开发和运行数据流时应用这些性能优化技巧。

视频致谢

感谢 Thomas Kejser 对 SSIS:性能设计和优化 - SQL Server 视频系列材料所做的贡献。本视频是该系列的第二部分。

感谢 Carla Sabotta 和 Douglas Laudenschlager 的指导和宝贵反馈。

视频脚本

视频时间戳 音频

00:00

您好,我是 David Noor,Microsoft 的 SQL Server Integration Services 的高级开发负责人。欢迎观看本视频,它介绍如何在企业中优化您的 SSIS 包数据流。

本视频是名为 SSIS:性能的设计和优化系列的第二部分,这个系列共四个部分。在这个系列的第一部分中,Denny 介绍了如何最好地测量和理解 SSIS 包的性能。在本单元中,我们将以第一部分为基础,看看如何改进您的 SSIS 包数据流的性能。开始时,我们将标识每个数据流中的共同主题,以及在尝试改进性能时如何选择应首先处理的数据流部分。一旦您理解了性能问题所在,就可以对您的数据流执行多种处理,从而加快运行速度、提高运行效率。我们将观看您在设计、开发、甚至执行数据流时可以应用的一系列具体技巧。

现在就开始吧!

大多数包数据流都以提取、转换和加载关键数据为中心,这三个过程有时候统称为 ETL。优化您的数据流意味着优化数据流的上述每个阶段:提取、转换和加载。

对于提取,我们将讨论如何优化 SSIS 源组件以及可提供最佳性能且对您的源系统影响最小的查询。

在您的数据流中优化转换意味着考察您需要完成的工作,通过消除不需要的步骤选择用来完成该工作的最佳方法,以及有时候更改为您执行转换的原始源查询。

最后,优化数据流的加载环节意味着优化 SSIS 目标组件、网络、锁定以及在尝试将数据加载到目标时可能会阻碍数据流行进的其他因素。

在这个视频中,我们将介绍一些实践技巧,您可以使用它们在数据流的所有这三个阶段中发现优化机会。

在我们开始观看这些技巧前需要牢记的是,在处理性能问题时通常没有所谓的“万灵丹”。这里没有一个技巧可以解决您的数据流可能遇到的所有性能问题。我们将展示的这些技巧在一些常见情形下可以大展身手,但不要认为只应用了这些技巧后您的问题就会迎刃而解。您最好始终理解您的数据流的用途,确保在设计上很好地满足这些目标,测量其当前性能,对您的数据流反复进行更改并且衡量所做更改是否改进了性能。

此外,当您斟酌某一性能问题时,很容易被局限在特定的技术或组件上,有时候只是因为您熟悉该技术或代码。但无论原因如何,都应该尽量在整个生态系统环境中考虑您的数据流 — 整个生态系统最可能由多个关系数据库、一个网络、多种操作系统、多种文件系统以及许多片断构成。您对整个生态系统了解的越多,在其中任何一个环节面临真正的性能挑战时,您就能够更好地把握全局,并且将能够作出效率更高而风险更小的改变。

03:38

我们将从数据流处理提取开始。在将 SQL Server 或具有大容量接口的任何其他数据库作为您的源时,您应该试验逐步增加包大小。通常,SQL Server 默认的 4096 字节大小就很合适了,但因为您的提取将要移动大量数据,所以提高该值应该会有所帮助。为使值的提高生效,您需要请求您的网络管理员对您的网络也启用“Jumbo 帧”。而您要测试这一更改对您的包的影响。如果您将同一个连接管理器既用于 OLE DB 源之类的大容量操作,也用于 OLE DB 命令之类的单行操作,则要考虑为 OLE DB 命令操作创建第二个连接管理器,并在那里使用更低的包大小。

如上所述,如果您的 ETL 正在 Windows 2008 上运行并且处于具有多个 NIC 的多核计算机上,则可以通过向单独的核心增加网卡而稍微改善网络性能。有关详细信息,请参阅 MSDN 网站上发布的博客主题 Scaling Heavy Network Traffic with Windows(使用 Windows 调控高网络通信量)。

用于优化提取的最容易的手段之一就是优化您正在使用的查询。有时候只选择您要从中提取的表并允许检索所有列颇具吸引力,但如果您只选择真正需要的列,结果将会好得多。这不仅会导致更少的网络通信流量和内存使用量,而且数据库服务器可能执行少得多的 I/O 即可满足您的查询。

如这里所示,对于 SQL Server,您还可以使用提示来指示在执行选择时没有应发出的共享锁,因此您的查询将读取可能未提交的数据或脏数据。只有在您必须具备最佳性能且确保读取脏数据对于您的 ETL 作业始终没有问题的情况下,才保留上述设置。

查找可被视作提取或转换。但无论是哪一种,您都应该贯彻我们在前一幻灯片中介绍的一些思路。在这里,只选择您需要的列甚至更为重要,这不仅对于网络优化很重要,对于内存中缓存的优化也十分重要。

如果您在使用 SQL Server 2008,它在性能方面的最佳特性之一就是添加了新的、共享的查找缓存。通过共享查找缓存,您可以一次就提取您的引用数据,然后在包内的多个查找操作中重复使用这些数据,甚至可以通过将缓存保存到某一文件来跨包重复使用它们。如果您具有引用相同表的多个查找组件,则要核查这个新的选择,确定它是否可作为大幅提高包的速度。使用它可能相当简单。在您的包中创建缓存连接管理器,使用新的缓存转换填充缓存,然后更改您的查找以便为其引用数据引用此缓存连接。

06:29

现在我们来进入 ETL 的第二个阶段:转换。在转换中,您处理已加载到数据流中的数据并尝试数据在加载前即获得适当的格式。在 SSIS 中,每个转换都表现为您可以拖入设计中的对象,但并非所有转换都是一样的。让我们看一下在 SSIS 中存在的三种转换:

  • 同步或基于行的转换就地对数据的缓冲区进行操作。在数据流经时此类转换不生成数据缓冲区或数据行的副本。它们直接在缓冲区中转换数据。这使得同步转换的速度相对较快。同步转换的例子包括数据转换、派生列和查找。
  • 部分阻塞的异步转换则有所不同。随着数据进入这些转换,转换需要持有这些数据以便完成转换。为此,它将传入的数据复制到内部缓冲区中并占用内存,有时候甚至会占用很多内存。随着数据继续流入,这些转换可能会认识到可以进一步写入输出数据。它们将写入输出数据并且释放一直在持有的相应内部内存。一旦数据流完成,它们将释放所占用的所有内存。但到了这个时候,它们通常将使用显著的数据量。
    此类转换的例子包括 Merge、MergeJoin 和 Union All。当您在数据流中具有这些转换时,应该寻求优化方法。是否存在它们的冗余副本?是否存在您可以“上推”到您的源系统的 MergeJoin 或 Union?我在过去看到过在源查询中执行 JOIN 的包,它们使用 OLE DB 源从两个表中提取了所有数据,然后在包中使用了 Merge Join 来执行联接,即使它们可能只在源上编写了 SQL 联接;由于数据库能够优化该查询,因此其速度可以大幅提高。请发现这些机会以便合并和减少异步转换的数目。
    在 SQL Server 2008 中,我们在数据流任务计划程序中付出了很多努力,以使复杂的数据流在性能上更优异并且更好地利用可用 CPU。如果您已在 SQL Server 2005 中开始使用 SSIS,则可能已将 Union All 转换引入到您的数据流中,以便人工拆分和并行化执行树。您不应再执行此操作。由于我们在 SQL Server 2008 中作出的改进,该操作不再需要并且不建议采用。删除这些人工 Union All 组件后,性能应该会得到提升。
  • 第三组转换是阻塞异步转换,它们就像是前一组转换的极端版本 – 它们必须首先持有所有输入数据,然后才能写入任何输出数据。如果在具有大批次数据的数据流中使用这些转换,则常常会显著减慢数据流的速度。如果您在大数据流中使用它们,请确保不要以冗余方式使用它们。如果您在同一数据流中对相同的数据具有两个聚合或两个排序,则应该对您的包进行重新处理以便认真考虑改变其中一个。

在介绍了基本知识后,让我们看一下几个具体的技巧:

  • 数据流需要转换某一列的数据类型的情况相当常见。尽量只执行此操作一次,并且使用尽可能窄的类型范围来保持数据缓冲区的紧密。转换数据也会占用 CPU 时间;因此,如果您的整个数据流可以将一种类型用于某一给定列,则考虑使用 SQL 的 CAST 或 CONVERT 函数或您的数据库的 SQL 方言中的等效函数,在您的数据源转换该列。
  • 我在以前的几个幻灯片中曾提到过这个问题,但您要通过睿智地思考在哪里需要采用来优化转换,并且不必担心在数据源使用 SQL 会影响您的利益。例如,如果您在对源数据进行排序,请考虑对您的数据源使用 SQL 中的 ORDER BY 子句。与数据流相比,您的数据库返回已排序数据的效率可能会高得多。对于需要对数据进行排序且这些数据是从多个数据源合并在一起的情况,请保存此处的排序组件。同样,在数据源使用 GROUP BY 和 SQL 聚合函数可以更快地执行某些聚合。
  • 如果您在使用 SQL Server 2008 并且使用渐变维度 (SCD) 组件,则应关注 SQL Server 中的新的 MERGE 功能。MERGE 可以完成该 SCD 可完成的许多相同工作,但没有那么多的网络往返的数目。
  • 此外,不要忘记 SQL 的 INSERT INTO 功能的实用性。如果您的数据流比较简单并且源和目标都位于同一数据库实例上,则可能能够通过单个 SQL 语句以快得多的速度执行相同的数据移动,这是因为数据移动完全在该数据库上发生。在这些情况下,INSERT INTO 的运行速度与数据流相比可以快一个数量级,因为数据永远不需要脱离服务器。
  • 最后,但也很重要的是,如果您在进行增量加载,则要关注对简单重新加载的替代方法。我看到某些系统用了很多时间来执行 Delta 检测以避免重新加载数据,但为了完成这一检测而占用的 I/O 和 CPU 最终会导致该作业的执行速度非常慢。

11:59

让我们继续介绍加载阶段。

在加载到 SQL Server 中时,您有两个很好的选择:

  • 第一个选择是 SQL Server 目标组件。此组件使用数据流和数据库引擎之间的共享内存来快速地加载数据,而非仅仅在您的数据流始终运行在 SQL Server 所处的计算机上时才工作。此外,SQL Server 目标具有某些与错误处理相关的已知局限。
  • 用于快速加载到 SQL Server 中的另一个选择是 OLE DB 目标,其运行速度常常与 SQL 目标接近一样快。

对于所有上述选择,使用 0 提交大小将导致最快的加载。

在进行大量加载时删除您的目标系统中的索引也是相当常见的行为,但您应该使用某些指导原则来知晓何时要这样做。一个常见的指导原则是基于加载预期导致的百分比增幅以及您在表上具有的索引类型来选择是否删除索引:

  • 如果您在表上具有单个聚集索引,则不要删除该索引。您的表数据按该键排序,并且与就地执行具有聚集索引的加载相比,您删除、插入和重新构建所花的时间几乎永远不会比前者少。
  • 如果您在表上具有单个非聚集索引,则在您的加载会导致数据大小近乎于倍增的情况下,应考虑删除该索引。这只是经验之谈,并非精确值,但如果您并不想要大了一倍的表,大体上讲可能就不值得删除后重新构建索引。
  • 如果您在表上具有多个索引,单凭经验就稍有些困难。我倾向于考虑 10% 的增幅。例如,加载比当前量少 10% 的数据就可能能够就地保留索引。不过,最好的做法还是反复试验并测量。

如果您在加载到还要执行其他活动的表中,就需要设计一个策略。大容量加载很可能会锁定大多数目标表,即使不是所有的目标表。因此,您需要确保这样做没问题或使用分区。如果您需要对运行数据库进行加载,最好设置一个要加载到的分区,以便当前运行数据可以保持活动状态。如果您的加载速度放慢,则要确保查清对该表或分区正在发生哪些其他活动,并且确保没有其他活动与加载操作争用。

有关提高大容量加载和分区性能的很有帮助的指南,请查看 MSDN 上的 SQLCAT 文章 The Data Loading Performance Guide(数据加载性能指南)。

此外,在进行重新加载时,请确保使用 TRUNCATE 而非 DELETE 来清除数据,以便删除将不是事务性的。

使用网络连接的目标也受到我在前面描述的相同网络问题的困扰。考虑增加包大小和对您的网络启用“Jumbo 帧”以便得到最佳的加载性能。

15:02

好啦,上面的内容就是这个性能系列的第二部分。特别感谢 Thomas 提供的所有帮助性信息,这些信息构成了这个视频系列的基础;同时还要感谢 Carla 和 Douglas,他们也对这个系列的创建帮助很大。有关这些主题的详细信息,请参考 Top 10 SQL Server Integration Services Best Practices(前 10 位的 SQL Server Integration Services 最佳实践)。

感谢您观看这个视频。请确保查看 SSIS:性能的设计和优化这个视频系列的其他三个部分。希望其内容会对您有所帮助,并且我们真诚欢迎您的反馈。在视频主页上的右上角中,有一个链接可供您进行评级和提供反馈。

请参阅

其他资源

SQLCAT 团队

帮助和信息

获取 SQL Server 2008 帮助