【问题标题】:Database design for incremental "export" to data warehouse增量“导出”到数据仓库的数据库设计
【发布时间】:2011-03-23 07:41:14
【问题描述】:

给定一个 1 TB 的关系数据库,目前在 SQL Server 中。数据仓库需要数据库主要部分的“副本”。仓库数据不应超过 24 小时。关系数据库的大小使得每晚都进行满载是不切实际的。我应该如何设计我的关系数据库来支持仓库的增量负载?

一天内只有很小一部分(

保持关系型数据库的性能是首要考虑,其次是不浪费不必要的空间。

【问题讨论】:

    标签: database-design data-warehouse etl


    【解决方案1】:

    有多种方法可以处理增量拉动。有很多关于各种方法和场景的书,所以我可以给你一个方法的例子。

    • 对于插入,使用单调递增的键来跟踪每次拉动的高水位线。在拉取数据之前,请检查目标表的最大值,然后从值大于该值的源中拉取。

    • 对于更新,增量基于“最后修改”时间戳。在每批结束时,您需要记下最新的时间戳并将其存储在您可以为下一批提取的地方。

    • 增量删除更难。我建议您为每个可删除表保留一个简单的审计表,您可以在其中跟踪已删除行的键值。对于每个批次,根据前一个批次的高水位线拉取,然后在您的目标系统中采取适用的操作。在某些情况下,例如安全港操作,您可以选择从目标系统中物理删除行。您可以选择简单地将目标记录标记为非活动。这取决于您设置的规则。

    当然,这不是唯一的方法。但希望它为您提供一些适用的上下文。

    【讨论】:

    • 为什么不简单地在源表中保留两个附加字段:日期时间和应该删除记录的标志。然后..我正在从最后一个 ETL 操作中加载所有较新的记录,新记录的插入,修改..修改,以及带有标记“已删除”的删除以及源表中的删除..
    • @约翰。如果我理解您的想法,您将在其上设置一个逻辑删除标志,其到期日期为您的 ETL 进程提供足够的窗口来获取已删除的记录。这是一个很好的方法。我试图弄清楚您是否建议 ETL 流程也负责删除源记录。如果是这样,我认为在外键可能导致删除失败的情况下,这会有点棘手。相反,我会选择一个了解源系统的 RI 结构的 reaping 进程。
    【解决方案2】:

    您需要捕获当天的变化,还是只需要在每天结束时获取当前状态的快照?

    如果快照是可接受的,那么您可以在每行更新时为其添加时间戳,以便识别更改。如果您需要所有日内更改,请查看某种更改数据捕获 (CDC) 解决方案。一些 DBMS 具有内置的 CDC/日志记录功能,并且有第三方工具也可以完成相同的工作。通常,他们会在不直接访问表的情况下抓取重做日志,以最大程度地减少源系统上的资源争用。

    【讨论】:

    【解决方案3】:

    这是一个棘手的领域 - 通常称为“提取、转换、加载”或 ETL。没有正确的答案,而且我找到的书都没有那么令人信服——拉尔夫·金博尔似乎写了最有用的书。

    首先,我建议您考虑将时间戳列添加到您的关系系统中;然后,您可以创建夜间查询以提取比上次成功运行更年轻的数据。您可能想要创建额外的表来存储传输状态 - 因此源表中的记录应该在传输表中具有相应的记录;如果该记录不存在,则说明该记录尚未转出。

    如果您的事务数据模型高度规范化,则管理依赖关系可能会很棘手 - 您必须首先迁移所有外键值,这可能会导致长依赖链。

    如果性能受到影响,您可能需要考虑使用事务数据库的镜像来运行 ETL 任务 - 这是一个全新的复杂层。

    我会先阅读 Kimball 的书籍,看看是否有任何想法可以直接适用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      相关资源
      最近更新 更多