数据库设计用于增量“导出”到数据仓库

时间:2011-03-23 07:41:14

标签: database-design data-warehouse etl

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

数据库的一小部分(<0.1%)在一天内发生变化,并且主要是插入。不需要日内更改,只需最终快照。

维护关系数据库的性能是首要考虑因素,其次是不浪费不必要的空间。

3 个答案:

答案 0 :(得分:2)

您是否需要捕获日内更改,或者您是否只需要在每天结束时获取当前状态的快照?

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

答案 1 :(得分:2)

这是一个棘手的领域 - 通常称为“提取,转换,加载”或ETL。没有正确的答案,我发现的所有书籍都没有令人信服--Ralph Kimball似乎写出了最有用的书。

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

如果您的事务数据模型严格规范化,那么管理依赖项可能会非常棘手 - 您必须首先迁移所有外键值,这可能会导致长依赖关系链。

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

我首先阅读了Kimball书籍,看看是否有任何想法直接适用。

答案 2 :(得分:2)

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

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

  • 有关更新,请将增量基于“上次修改”的时间戳。在每批次结束时,您需要记下最新的时间戳,并将其存储在下一批可以拿到的地方。

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

当然,这不是唯一的方法。但希望它能为您提供一些适用的背景。