1

我正在优化数据流任务。我 Ado.Net 源触发如下查询。

Select Emp_id, EmpName, Salary from Employee.

在源之后,我有一个派生列转换,其中添加了一个具有用户变量值的派生列@[User::TestVariable].

现在我想这个派生的列转换至少需要一些时间,所以我想知道是否可以通过在源代码中执行以下操作来节省时间。

Select Emp_id, EmpName, Salary, DerivColumn as @[User::TestVariable]
 from Employee

有可能做这样的事情吗?如果是的话怎么办?

在此处输入图像描述

以上是 DFT,我正在研究如何找出哪个组件花费了多少时间,所以我可以寻求优化。

4

2 回答 2

2

您可以在 ADO.NET Source 中使用该变量。

1.在DFT任务的属性窗口中点击表达式属性,选择ADO.NET Source SQL Command

在此处输入图像描述

  1. 在表达式中写下你的 SQL 查询

    Select LoginId,JobTitle," + (DT_WSTR,10) @[User::TestVariable] + " as DerivedColumn
    from HumanResources.Employee"
    

在此处输入图像描述

我认为您的派生列不会增加任何开销,因为它是一个非阻塞组件(bt 有一些例外)

为了找到单个组件的速度,

1.计算包的整体执行时间,您可以在执行结果选项卡中找到它

  Overall Execution Speed = Source Speed + Transformation Speed

2.删除派生组件并将源连接到行转换。现在再次查看执行时间。这将为您提供源速度。

  1. Overall Execution Speed - Source Speed = Transformation Speed
    

SSIS是一个内存管道,所以它的所有转换都发生在内存中。它严重依赖缓冲区。在你的情况下,SSIS缓冲区有196,602行。这个值由2个属性控制 DefaultMaxBufferRowsDefaultMaxBufferSizeMaximumBufferSize是100MB。现在你需要计算通过计算表中的列大小来估计行大小。假设添加数据类型长度约为 40 个字节,那么 196,602 行的字节数为

  196,602*40=7864080 ~ 7MB

这小于 DefaultMaxBufferSize 10MB。您可以尝试增加 DefaultMaxBufferRows 以提高速度。但是在得出结论之前,您需要再次进行所有性能测试。我建议您阅读这篇文章以全面了解 SSIS 性能

于 2012-08-21T13:58:01.937 回答
0

因此,您希望向数据集中添加一个具有固定值(包含在 @[User::TestVariable] 上)的新列,以便稍后在目标上插入,对吧?不,你不能做你想做的事情,因为范围是数据库(你执行查询的地方)并且变量在包上。

你确定这个派生列操作需要那么长时间吗?它不应该。如果是,您可以使用执行 SQL 任务将数据库上的这个值插入到临时表中,然后在查询中使用它

declare @aux int
select @aux = your_config_column from your_temp_table

Select Emp_id, EmpName, Salary, @aux as DerivColumn 
from Employee

这是一种混乱的解决方案,但如果派生列真的花了那么长时间,这是值得的

于 2012-08-21T09:39:42.650 回答