在DataFlow中,假设我必须派生一个新列myDate,其值将是GetDate()或sysdatetime(),无论...... 我有两个选择: 在Source OleDB中添加此列选择如下:
Select
col1, col2, ..., getDate() as myDate
from myTable
或者我可以添加一个SSIS“派生列”步骤并将我的getDate()表达式放在那里。
在性能方面哪个选项更好?
答案 0 :(得分:2)
这取决于。在查询中使用GetDate()/ current_timsetamp与在派生列中使用它之间存在细微差别。
源查询中的getdate / current_timestamp将被评估一次。因此,您的myDate值对于整个数据集将保持不变。也许这对你的应用来说是正确的,也许不是。
将在每N个时间间隔评估派生列中的表达式getdate。对于大型进口产品,您可以获得相当大的价值漂移。也就是说,提交的第一行有2014-02-06T11:46:00.000
,而最后一行有2014-02-06T15:21:19.762
。同样,这是否是更理想的行为取决于您和您的应用程序。由于我们只能根据日期关联导入活动,因此我必须编写的查询与DW中的导入行为关联起来很复杂。
如果您希望使用派生列但具有一致的参考点,请使用一些System
命名空间变量。我们经常使用@[System::StartTime]
,但@[System::ContainerStartTime]
会提供与数据流开头更紧密相关的开始时间。
答案 1 :(得分:0)
在数据库上执行此操作会更好,因为您不必使用内存为数据流中的每一行创建新列。
答案 2 :(得分:0)
我认为如果你在select语句中而不是在ssis中的派生列中这样做会更好。