包性能故障排除

更新日期: 2007 年 9 月 15 日

Integration Services 包括可以用于对包性能进行故障排除的功能和工具。 例如,日志记录可以捕获有关包的运行时信息,性能计数器可以监视数据流引擎。 本主题介绍这些功能并提供包设计方面的建议,以避免出现常见性能问题。

设计数据流以获得更好的性能

通过在包中测试下列建议的效果,您可以对包中数据流的性能问题进行故障排除:

优化查询

很多数据流组件都使用查询来创建引用表,例如,在从源中提取数据时以及在查找操作中,都需要使用查询。 默认查询使用 SELECT * FROM <表名> 语法。 这种类型的查询返回源表中的所有列。 在设计时使所有列可用,意味着可以选择任意列作为查找列、传递列或源列。 但是,在选择了要使用的列后,您应该修改查询使其只包括所使用的列。 您可以键入查询,也可以使用查询生成器来构造查询。 删除多余的列可以使包中的数据流更高效,因为行越小,可以置入一个缓冲区的行就越多,处理数据集中所有行的工作量也就越少。

ms141031.note(zh-cn,SQL.90).gif注意:
在 Business Intelligence Development Studio 中运行包时,SSIS 设计器的“进度”选项卡将列出警告信息,包括当源向数据流提供了某个数据列但下游数据流组件却没有使用它时出现的警告信息。 您可以使用 RunInOptimizedMode 属性来自动删除这些列。

配置数据流任务的属性

您可以配置数据流任务的下列属性,这些属性都会对性能产生影响:

  • 为缓冲区数据(BufferTempStoragePath 属性)和包含二进制大型对象 (BLOB) 数据的列(BLOBTempStoragePath 属性)指定临时存储位置。 默认情况下,此属性的值为 TEMP 环境变量的值。 最好指定其他文件夹以在不同硬盘驱动器上放置临时文件,或者将其分布在多个驱动器上。 可以指定多个目录,并用分号来分隔这些目录名。
  • 通过设置 DefaultBufferSize 属性定义任务使用缓冲区的默认大小,并通过设置 DefaultBufferMaxRows 属性来定义每个缓冲区中最大的行数。 默认缓冲区大小为 10 MB,最大缓冲区大小为 100 MB。 默认最大行数为 10,000。
  • 通过设置 EngineThreads 属性来设置任务在执行过程中可使用的线程数。 此属性为数据流引擎提供有关使用线程数的建议。 默认值为 5,最小值为 2。但是,不论此属性值为多少,引擎都不会使用超过其所需的线程数。 如果需要避免并发问题,引擎所使用的线程数也可能会超过此属性指定的线程数。
  • 指示数据流任务是否以优化模式运行(RunInOptimizedMode 属性)。 优化模式会从数据流删除未使用的列、输出和组件,从而提高性能。
    ms141031.note(zh-cn,SQL.90).gif注意:
    可以在 Business Intelligence Development Studio 中的项目级设置同名属性 RunInOptimizedMode,以指示调试过程中数据流任务以优化模式运行。 此项目属性在设计时将覆盖数据流任务的 RunInOptimizedMode 属性。

了解数据流任务如何调整缓冲区大小

数据流引擎通过计算一行数据的估计大小来开始调整其缓冲区大小的任务。 然后引擎将估计的单行大小与 DefaultBufferMaxRows 值相乘以获得缓冲区大小的初步工作值。

  • 如果该结果大于 DefaultBufferSize 值,引擎将减少行数。
  • 如果该结果小于内部计算的最小缓冲区大小,引擎将增加行数。
  • 如果结果在最小缓冲区大小和 DefaultBufferSize 值之间,引擎将调整缓冲区大小,以尽可能接近估计行大小乘以 DefaultBufferMaxRows 值得出的结果。

调整缓冲区大小

当您开始测试数据流任务的性能时,请使用 DefaultBufferSizeDefaultBufferMaxRows 的默认值。 对数据流任务启用日志记录,并选择 BufferSizeTuning 事件以查看每个缓冲区中包含多少行。

在开始调整缓冲区大小之前,您可以采取的重要改进措施是通过删除不需要的列并配置相应的数据类型来减少每一个数据行的大小。

在有足够的可用内存时,请使用少量的大缓冲区,而不是大量的小缓冲区。 换而言之,可以通过减少存放数据所需的缓冲区总数并在一个缓冲区中放置尽可能多的数据行来改善性能。 若要确定缓冲区的最佳数目及其大小,请在试验 DefaultBufferSize 值和 DefaultBufferMaxRows 值的同时监视性能以及由 BufferSizeTuning 事件报告的信息。

ms141031.note(zh-cn,SQL.90).gif注意:
必须为包中的每个数据流任务单独设置本节所讨论的数据流任务属性。

避免不必要的排序

排序本身是非常缓慢的操作,因此避免不必要的排序可以提高包数据流的性能。

如果因为 SELECT 查询使用 ORDER BY 子句或者因为将数据按排序顺序插入源中而要对源数据进行排序,则您可以提供一个提示说明数据已排序,并避免使用排序转换来满足特定下游转换的排序要求。 例如,合并和合并联接转换要求使用已排序的输入。 若要提供提示,可以将上游数据流组件的输出的 IsSorted 属性设置为 True,然后指定数据排序所依据的排序键列。 有关详细信息,请参阅如何在输出上设置排序属性

如果必须在数据流中对数据排序,则可以将数据流设计为使用尽可能少的排序操作来提高性能。 例如,如果数据流使用多播转换复制数据集,则可以在多播转换开始其工作前排序一次数据集,而不是在转换后排序多个输出。

有关详细信息,请参阅排序转换合并转换合并联接转换多播转换

优化渐变维度转换

渐变维度向导和渐变维度转换是可满足大多数用户需求的通用工具。 但是,向导生成的数据流没有进行性能优化。

在渐变维度转换中,执行速度最慢的组件通常是 OLE DB 命令转换,这种转换每次仅针对一行执行 UPDATE。 用目标组件替换这些 OLE DB 命令转换通常可以提高渐变维度转换的性能。 这些目标组件将要更新的所有行保存到一个中间临时表中。 然后,您可以添加一个执行 SQL 任务,该任务同时针对所有行执行一个基于集的 Transact-SQL UPDATE 操作。

高级用户可以为渐变维度处理设计一个针对大型维度进行了优化的自定义数据流。 有关此方法的讨论和示例,请参阅 Microsoft 白皮书 Project REAL:商业智能 ETL 设计实践中的“Unique dimension scenario”(唯一维度方案)部分。

优化聚合转换中的聚合

聚合转换包括很多可用于提高其性能的属性。 如果知道数据集中键值的准确或近似数量,则可以设置 KeysKeysScale 属性。 通过设置 CountDistinctKeysCountDistinctScale 属性,您还可以指定对于 COUNT DISTINCT 操作,期望转换可以处理的键的准确和近似数量。 通过使用这些属性,转换可以避免重复组织缓存的总量,从而可以提高性能。

如果需要在数据流中创建多个聚合,您应该考虑使用一个聚合转换而不是创建多个转换来创建多个聚合。 如果聚合是其他聚合的子集,这种方法尤其能够提高性能,因为转换可以优化内部存储,并且只需扫描传入的数据一次。 例如,如果聚合使用 GROUP BY 子句和 AVG 聚合,将它们组合成一个转换可以提高性能。 但是,只有在内存不足时才应考虑这种方法,因为在一个聚合转换内执行多个聚合会序列化聚合操作。

有关详细信息,请参阅聚合转换

在合并联接转换中配置缓冲区中止

合并联接转换包括 MaxBuffersPerInput 属性,该属性指定可以同时为每个输入处于活动状态的最大缓冲区数。 可以使用此属性来优化缓冲区所使用的内存量,并由此优化转换的性能。 缓冲区数越大,转换所使用的内存越多,性能越好。 MaxBuffersPerInput 的默认值是 5,这是适合大多数工作情况的缓冲区数。 若要优化性能,最好尝试使用稍有不同的缓冲区数,例如,4 或 6。如果可能,应当避免使用非常小的缓冲区数。 例如,将 MaxBuffersPerInput 设置为 1 而不是 5,则可能对性能造成很大影响。 还有,不应当将 MaxBuffersPerInput 设置为 0。此值表示没有中止发生,并且由于数据负载和可用内存量,包可能无法完成。

若要避免死锁,合并联接转换可能临时增加它所使用的缓冲区数,使其超过 MaxBuffersPerInput 的值。 死锁条件消除之后,MaxBuffersPerInput 将返回它的配置值。

有关详细信息,请参阅合并联接转换

测试目标的性能

您可能会发现将数据保存到目标时所花的时间比预期的要长。 为了确定速度缓慢是否是由于目标处理数据的能力不足造成的,可以暂时将目标替换为行计数转换。 如果吞吐量显著提高,很可能是加载数据的目标导致速度减缓。 有关详细信息,请参阅行计数转换

监视包的性能

Integration Services 包括可以用于监视包性能的工具和功能。 请使用下列建议确定包中对性能影响最大的部分:

查看“进度”选项卡上的信息

SSIS 设计器提供有关在 Business Intelligence Development Studio 中运行包时控制流和数据流的信息。 **“进度”**选项卡按执行顺序列出任务和容器,而且还包括每个任务和容器及包自身的开始时间和结束时间、警告以及错误消息。 它还按执行顺序列出数据流组件并包括进度信息(显示为完成百分比)和处理的行数。

配置包中的日志记录

Integration Services 包括各种日志提供程序,这些提供程序允许包在运行时将信息记录到不同类型的文件中或记录到 SQL Server 中。 您可以为包和各个包对象(例如任务和容器)启用日志项。Integration Services 包括各种任务和容器,每个任务和容器都具有其自己的一组说明性日志项。 例如,包括执行 SQL 任务的包可以写入一个日志项,列出该任务执行的 SQL 语句(包括该语句的参数值)。

这些日志项包括诸如包和包对象的开始时间和完成时间这样的信息,从而可以确定运行缓慢的任务和容器。 有关详细信息,请参阅记录包执行的日志在包中实现日志记录日志记录的自定义消息

配置数据流任务的日志记录

数据流任务提供了许多可用于监视和调整性能的自定义日志项。 例如,您可以监视可能会导致内存泄漏的组件,或者跟踪特定组件运行所用的时间。 有关这些自定义日志项的列表和日志记录输出示例,请参阅数据流任务

监视数据流引擎的性能

Integration Services 包括一组性能计数器,用于监视数据流引擎的性能。 例如,您可以跟踪所有缓冲区使用的内存总量(以字节为单位),并检查组件是否内存不足。 缓冲区是组件用于存储数据的内存块。 有关详细信息,请参阅监视数据流引擎的性能

请参阅

任务

包开发故障排除

概念

包执行故障排除
Integration Services 服务故障排除

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2007 年 9 月 15 日

更改的内容:
  • 新增了有关优化渐变维度转换的部分。

2006 年 7 月 17 日

更改的内容:
  • 添加了优化目标性能的部分以及使用日志记录的方法。

2005 年 12 月 5 日

更改的内容:
  • 添加了有关合并联接转换中的调整最大缓冲区数的部分。