如何在执行ETL过程时减少对OLTP的影响

时间:2011-02-23 20:32:34

标签: sql-server database etl data-warehouse

我是设计ETL流程的新手。目前我有两个数据库,一个是实时数据库,应用程序将其用于每天的事务。另一个是数据仓库。

我在live数据库中有一个表,它经常插入新数据。目标是每晚ETL过程将实时数据库中的数据传输到数据仓库,然后删除实时数据库中的数据。

由于我缺乏知识,我得到的解决方案是实现调用滚动表的东西。基本上在实时数据库中,我有两个具有相同结构的表。我称之为 tblLive1 tblLive2 。我也有一个同义词叫 tblLive 。所有插入都在同义词上完成。同义词将指向其中一个表。

当我运行ETL过程时,我有一个存储过程会丢弃并创建一个指向 tblLive2 的新同义词。这允许ETL过程从 tblLive1 转换数据而不影响应用程序。假设ETL过程需要一个小时才能运行,我不希望ETL过程锁定表,阻止应用程序向其插入新数据。

这个解决方案理论上应该有效,但不优雅。

我确信这个问题是一个常见问题,还有其他解决方案吗?

2 个答案:

答案 0 :(得分:2)

要添加Bob的答案(上图),在DWH / BI应用程序中,通常所有必需的表都被复制到DWH数据库的“登台”数据库或“登台”模式中(取决于数量)表/大小等)。这些通常位于与OLTP系统不同的服务器上 - 用于任何大小的DWH实现)

要回答有关性能影响的问题,这取决于您的服务器规格/配置。

数据是否每天24小时插入OLTP系统?还是有停机时间?或者交通时间短?

使用数据库压缩可能是值得的,因为IO将成为你最大的敌人,这将有很大帮助。

答案 1 :(得分:1)

将表读入临时区域并处理临时表。您通常希望在生产系统上花费的时间与您一样少。特别是如果它正在使用中。

您可能还想查看使用触发器加载的表格。或者,如果您使用的是SQL 2008,则更改数据捕获