【发布时间】:2011-03-23 07:41:14
【问题描述】:
给定一个 1 TB 的关系数据库,目前在 SQL Server 中。数据仓库需要数据库主要部分的“副本”。仓库数据不应超过 24 小时。关系数据库的大小使得每晚都进行满载是不切实际的。我应该如何设计我的关系数据库来支持仓库的增量负载?
一天内只有很小一部分(
保持关系型数据库的性能是首要考虑,其次是不浪费不必要的空间。
【问题讨论】:
标签: database-design data-warehouse etl
给定一个 1 TB 的关系数据库,目前在 SQL Server 中。数据仓库需要数据库主要部分的“副本”。仓库数据不应超过 24 小时。关系数据库的大小使得每晚都进行满载是不切实际的。我应该如何设计我的关系数据库来支持仓库的增量负载?
一天内只有很小一部分(
保持关系型数据库的性能是首要考虑,其次是不浪费不必要的空间。
【问题讨论】:
标签: database-design data-warehouse etl
有多种方法可以处理增量拉动。有很多关于各种方法和场景的书,所以我可以给你一个方法的例子。
对于插入,使用单调递增的键来跟踪每次拉动的高水位线。在拉取数据之前,请检查目标表的最大值,然后从值大于该值的源中拉取。
对于更新,增量基于“最后修改”时间戳。在每批结束时,您需要记下最新的时间戳并将其存储在您可以为下一批提取的地方。
增量删除更难。我建议您为每个可删除表保留一个简单的审计表,您可以在其中跟踪已删除行的键值。对于每个批次,根据前一个批次的高水位线拉取,然后在您的目标系统中采取适用的操作。在某些情况下,例如安全港操作,您可以选择从目标系统中物理删除行。您可以选择简单地将目标记录标记为非活动。这取决于您设置的规则。
当然,这不是唯一的方法。但希望它为您提供一些适用的上下文。
【讨论】:
您需要捕获当天的变化,还是只需要在每天结束时获取当前状态的快照?
如果快照是可接受的,那么您可以在每行更新时为其添加时间戳,以便识别更改。如果您需要所有日内更改,请查看某种更改数据捕获 (CDC) 解决方案。一些 DBMS 具有内置的 CDC/日志记录功能,并且有第三方工具也可以完成相同的工作。通常,他们会在不直接访问表的情况下抓取重做日志,以最大程度地减少源系统上的资源争用。
【讨论】:
这是一个棘手的领域 - 通常称为“提取、转换、加载”或 ETL。没有正确的答案,而且我找到的书都没有那么令人信服——拉尔夫·金博尔似乎写了最有用的书。
首先,我建议您考虑将时间戳列添加到您的关系系统中;然后,您可以创建夜间查询以提取比上次成功运行更年轻的数据。您可能想要创建额外的表来存储传输状态 - 因此源表中的记录应该在传输表中具有相应的记录;如果该记录不存在,则说明该记录尚未转出。
如果您的事务数据模型高度规范化,则管理依赖关系可能会很棘手 - 您必须首先迁移所有外键值,这可能会导致长依赖链。
如果性能受到影响,您可能需要考虑使用事务数据库的镜像来运行 ETL 任务 - 这是一个全新的复杂层。
我会先阅读 Kimball 的书籍,看看是否有任何想法可以直接适用。
【讨论】: