合并时的数据流

Data streams in case of Merge

我们发现有大量的数据流量进出我们的 SSIS 服务器。我们找不到罪魁祸首。有什么办法可以找出是哪个包导致了所有的流量?有什么建议吗?我们在想,也许我们所做的所有合并都会导致所有流量。我们的 SSIS 机器从多个生产 SQL 服务器获取数据,并将其与我们仓库中的数据合并。死亡意味着

那么您将如何限制所有进出的数据?

问题 a、b 和 c(如果您在 SSIS 中使用 SSIS 转换组件)的答案本质上是“是的,转换所需的所有新数据和现有数据都将流入 SSIS 实例,并由此产生合并后的数据将从 SSIS 实例流出到目标服务器”。更详细的解释如下。

假设您使用的是 SQL Server 2012 及更高版本,您将能够启用详细日志记录以捕获传输的行数。 [目录].[execution_data_statistics] 中捕获了详细信息。如果您正在寻找以字节为单位的大小,则需要根据正在提取和转换的列与行数进行计算。 [目录].[execution_data_statistics] 捕获包名、任务名、数据流路径和source/destination 组件名、执行时间和执行路径,非常适合诊断。

SSIS 是内存中管道。如果您有 3 个独立的服务器,Source、SSIS 和 Target,data/traffic 的数量会有所不同。例如,如果数据流任务需要转换并使用 Merge、Merge Join、Lookup 等组件,您可以期望数据从源服务器、SSIS 服务器和目标服务器流出。

另一方面,如果您是 运行 一个简单的数据流任务,目标是 SQL 服务器目标,位于具有相同源和目标的 2 个数据库之间,SSIS 将发出 BULK INSERT 语句在目标(= 源 = SSIS 服务器)实例上。在这种情况下,通过网络的数据流量将非常低(至少与 BULK INSERT 语句无关)。

如果您的程序包包含调用 MERGE t-sql 语句的“执行 SQL 任务”组件,这不会导致 SSIS 服务器的数据流量 into/out。 activity 将在执行 MERGE 语句的 SQL 服务器实例上完成。如果您使用的是链接服务器,那么数据将按照 MERGE 语句的要求流向 into/out 的 linked 服务器,就像您在实例上调用该语句一样。

对于限制来回移动的数据量,我的建议是在源级别有选择性。例如,如果您知道您只会在 dbo.Customer 中使用 ColumnA、ColumnB、ColumnC,则使用

SELECT [ColumnA], [ColumnB], [ColumnC]  FROM [dbo].[Customer] --
Better!

而不是以下语句,它可能会检索超过这 3 列的内容:

SELECT * 
FROM [dbo].[Customer]  -- Do Not Use

还有许多优化 SSIS 的最佳做法,包括减少带宽和优化传输的数据量,您可以遵循这些做法。请在这里阅读:http://blogs.msdn.com/b/sqlcat/archive/2013/09/16/top-10-sql-server-integration-services-best-practices.aspx。 如果您在混合平台上工作,您可能也有兴趣阅读 "SSIS for Azure and Hybrid Data Movement" 白皮书 (https://msdn.microsoft.com/en-us/library/jj901708.aspx)。本白皮书还有一个额外的 link 到 "SSIS Operational and Tuning Guide",这也很有用。

此外,您可能还有兴趣查看 CodePlex 上提供的 SSIS 报告包,以更直观地了解服务器上的 SSIS 执行情况。

希望这对您有所帮助。 朱莉