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