8kb*_*8kb 2 replication data-warehouse sql-server etl incremental-load
每天将大约 200 个 SQL Server 2005 源数据库(相同架构)加载到暂存区以准备数据仓库清理、重复数据删除和转换的最佳提取策略是什么?
到目前为止,我已经设想了以下可能性:
额外的想法:
如果您有 200 个相同的源,那么您可以使用数据源参数化 SSIS 包并启动多个线程。这些可以通过 foreach 循环或从使用参数启动提取器的外部源在包内进行控制。
您可以考虑对相对较小的维度源进行完全加载,对事务数据进行增量加载。这将要求您拥有持久的维度,但如果您需要缓慢更改维度,这对于 MERGE 操作或预加载区域和维度处理程序来说相当简单。
您可能希望考虑为每个源提供自己的暂存区(可能是暂存数据库中每个源的模式)。这消除了临时表上的锁定问题。在包含数据源信息的临时表上构建一组视图(本质上只是一组对应于每个源表的联合)。这些可以很容易地生成,因此您不必手动将 200 个不同的查询剪切并粘贴到联合中。一旦您暂存了数据,那么 ETL 过程就可以从视图中读取全部内容。
这允许 ETL 一次性运行,尽管您必须想出一种策略来处理从单个系统中提取失败的问题。为此,您可能希望研究一种能够优雅地处理迟到数据的架构,以便您可以赶上存在瞬态问题的单个提要。
BCP
对于 200 个简单的提取,BCP 可能是一个不错的方法。来源都是相同的,因此 BCP 文件在来源之间是相同的。您可以使用 SSIS 构建负载控制器。让多个线程读取公共列表的顶部需要您实现对列表的同步访问。SSIS 进程有一堆在序列容器中并行运行的循环,它们弹出下一个项目,执行它并更新相应的状态。
实现“next”函数使用在可序列化事务中运行的 sproc,它从列表中弹出“next”合格源并将其在事务中标记为“in progress”。这是一个“表作为队列”的问题,但您不必实现同步插入 - 可以在运行开始时将整批推送到表中。
构建单独的提取过程,以便在第一次尝试失败时再次尝试一次或两次。这将减轻由瞬态错误引起的许多故障。如果任务失败两次,则使任务失败,并构建 ETL 以使其对单个提取失败具有弹性。
增量负载
增量加载器可能不值得为维度表烦恼,除非您有一个非常大的维度来显示真正的性能问题。对于事实表数据源,它可能是值得的。如果您可以使用时间戳列或类似列向应用程序表添加行版本,则可以获取新内容。但是,您需要在本地跟踪它以记录最后的时间戳。如果数据上有插入或更新日期,您可以改用它。
满载
什么可能出错?
200 个进程开始执行满载,从而使网络和暂存数据库的负载激增。这可能会导致各种暂时性问题,例如超时。对于小维度表,这可能不是什么大问题。然而,对于 100GB,存在各种各样的问题 - WAN 饱和、锁定(尽管正确的暂存架构会缓解这种情况)、资源的可用性。提取过程运行的时间越长,环境因素对过程可靠性的影响就越大。
这里有很多不可估量的东西,所以YMMV。如果可能,我建议为较大的表增加负载。