我正致力于优化数据流任务。我Ado.Net源发出如下的查询。
Select Emp_id, EmpName, Salary from Employee.
在源代码之后我得到了一个派生列转换,它添加了一个带有用户变量值@[User::TestVariable].
的派生列
现在我猜这个派生列变换至少需要一些时间,所以我想知道我是否可以通过在源头做类似下面的事来节省时间。
Select Emp_id, EmpName, Salary, DerivColumn as @[User::TestVariable]
from Employee
有可能做这种事吗?如果是的话怎么样?
以上是DFT我正在研究如何找出哪个组件占用了多少时间,所以我可以优化它。
答案 0 :(得分:2)
您可以在ADO.NET Source中使用该变量。
1.在DFT任务的属性窗口中,单击表达式属性并选择ADO.NET源SQL命令
在表达式中编写SQL查询
Select LoginId,JobTitle," + (DT_WSTR,10) @[User::TestVariable] + " as DerivedColumn
from HumanResources.Employee"
我不认为您的Derived Column会增加任何开销,因为它是一个非阻塞组件(bt有一些例外)
为了找到单个组件的速度,
1.计算程序包的总执行时间,您可以在执行结果选项卡中找到它
Overall Execution Speed = Source Speed + Transformation Speed
2.删除派生组件并将源连接到行transaformation.Now再次看到执行时间。这将为您提供源速度。
Overall Execution Speed - Source Speed = Transformation Speed
SSIS是一个内存中的管道,所以它的所有转换都发生在内存中。它在缓冲区上大量回复。在你的情况下,SSIS缓冲区龋齿196,602行。这个值由2个属性控制
DefaultMaxBufferRows
和DefaultMaxBufferSize
。MaximumBufferSize是100MB。现在需要通过计算表中的列大小来计算估计的行大小。假设添加数据类型的长度大约是40个字节,然后是196,602行的字节数是
196,602*40=7864080 ~ 7MB
小于DefaultMaxBufferSize 10MB。您可以尝试增加DefaultMaxBufferRows以提高速度。但是,在完成结论之前,您需要再次进行所有性能测试。 我建议您阅读this文章,以全面了解SSIS效果
答案 1 :(得分: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
这是一种混乱的解决方案,但如果衍生专栏确实需要很长时间,这是值得的