我们可以在DFT的Source查询中访问用户变量吗?

时间:2012-08-21 09:14:09

标签: sql ssis dft user-variables

我正致力于优化数据流任务。我Ado.Net源发出如下的查询。

Select Emp_id, EmpName, Salary from Employee.

在源代码之后我得到了一个派生列转换,它添加了一个带有用户变量值@[User::TestVariable].的派生列

现在我猜这个派生列变换至少需要一些时间,所以我想知道我是否可以通过在源头做类似下面的事来节省时间。

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

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

enter image description here

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

2 个答案:

答案 0 :(得分:2)

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

1.在DFT任务的属性窗口中,单击表达式属性并选择ADO.NET源SQL命令

enter image description here

  1. 在表达式中编写SQL查询

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

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

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

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

      Overall Execution Speed = Source Speed + Transformation Speed
    

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

    1. Overall Execution Speed - Source Speed = Transformation Speed
      
    2. SSIS是一个内存中的管道,所以它的所有转换都发生在内存中。它在缓冲区上大量回复。在你的情况下,SSIS缓冲区龋齿196,602行。这个值由2个属性控制 DefaultMaxBufferRowsDefaultMaxBufferSize。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

这是一种混乱的解决方案,但如果衍生专栏确实需要很长时间,这是值得的