sql-server-2008 - 在 ETL 期间或插入数据仓库期间计算计算列

标签 sql-server-2008 data-warehouse etl

我希望有人能给我一些关于何时计算存储在数据仓库中的计算值的最佳实践。

考虑下面的例子,

CREATE TABLE
(
    MyFactID INT NOT NULL IDENTITY(1, 1),
    OrderDimID INT NOT NULL, -- FK To OrderDimension
    StartDate DATETIME NOT NULL,
    CompletedDate DATETIME NULL,
    ElapsedCalendarTimeInMinutes INT NULL,
    ElapsedBusinessTimeInMinutes INT NULL
)

在此示例中,以分钟为单位的已用日历时间将是从开始日期到结束日期的时间(以分钟为单位)。然后,我们的工作时间反射(reflect)了那些日历日内可用的工作时间。

目前,我们正在 ETL 期间计算并插入两个日期。我想知道这是否是执行此操作的正确位置。

其他一些想法是:

A) 通过仅将开始日期和结束日期存储在事实表中来使用索引 View ,然后创建一个以分钟为单位计算耗时的 View ,并具有一个使用函数计算工作日的计算列。

B) 在发生将完成日期插入或更新为非空值的插入后,使用 After 触发器更新经过的日历时间和业务时间。

我觉得这应该在数据库中完成,这样如果对结束日期或业务时间的计算进行了任何更改,它就会反射(reflect)出来。在 ETL 期间执行它似乎很容易出问题。

对此有任何想法表示赞赏!

更新:至少有6列这样确定。我们有工作分钟、时间和天数(我们的业务天数为 12 小时);然后我们有客户的分钟数、小时数和天数(通过查找表确定客户的工作时间);然后我们有简单的日历分钟、小时和天(尽管这些没有被存储;只有分钟)。由于这是一个 DW,我希望所有数据都存在并且不需要计算。对我来说,确保 ETL 正确并在所有地方应用似乎比在基础数据之上创建 View 以获取计算信息需要更多的工作。

最佳答案

最简单的方法应该是最好的解决方案:

在您的 ETL 过程中(让我们假设它是 SSIS,但您可以推断为其他技术):

  1. 创建一个 data flow将表从您的操作数据库复制到数据仓库后台。
  2. 使用 T-Sql task 更新事实表. merge声明应该足够了:

合并示例:

MERGE Target AS T
USING Source AS S
ON ( __  matching criteria ___) 
WHEN NOT MATCHED BY TARGET
    THEN INSERT( OrderDimID, startDate, ... ) VALUES( ... )
WHEN MATCHED 
    THEN UPDATE SET T.ElapsedCalendarTimeInMinutes = ___some calculations___
WHEN NOT MATCHED BY SOURCE
    THEN DELETE (?)

这避免了触发器和索引 View 。

关于sql-server-2008 - 在 ETL 期间或插入数据仓库期间计算计算列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12097517/

相关文章:

sql-server - 条件中的 T-SQL USE 语句

sql-server - 请解释一下 PIVOT 的组成部分

sql - 在同一个查询中获取计数和行数

sql-server - OLE DB 命令 DT_NTEXT 输出类型和 XML 输入

MySQL Pentaho通信链接错误ETL

django - 如何使用 django-mssql 连接到 SQL Server 2008 R2?

mysql - 数据仓库中的标记维度

mysql - 使用 SQLyog 将数据从 Excel 导入到 MySQL 数据库

sql-server - 数据库设计: one huge table or separate tables?

windows - 如何在 DB2 表上写入数据阶段性能统计信息?