【问题标题】:How do I keep a table synchronized with a query in SQL Server - ETL?如何使表与 SQL Server - ETL 中的查询保持同步?
【发布时间】:2009-10-02 12:44:44
【问题描述】:

我不知道如何表达这个问题,所以我会试着解释一下。我在 SQL Server 2005 上有一个第三方数据库。我有另一个 SQL Server 2008,我也想“发布”第三方数据库中的一些数据。然后我将把这个数据库用作门户和报告服务的后端——它应该是数据仓库。

在目标服务器上,我想将数据存储在与第三方数据库不同的表结构中。我想对一些表进行非规范化,并且有很多列是不必要的。我还需要向一些需要根据存储在同一行中的数据更新的表添加其他字段。例如,有些 varchar 字段包含我想要填充其他列的信息。所有这些都应该清理数据并使其更易于报告。

我可以编写查询以在特定目标表中获取我想要的所有信息。但是,我希望能够使其与另一台服务器上的源保持同步。它不必立即更新(尽管那会很好),但我希望它可能每 10 分钟更新一次。有上百行的数据,但数据的变化和新行的添加等并不大。

我环顾四周,但我仍然不确定实现这一目标的最佳方法。据我所知,复制不会做我需要的。我可以手动编写 t-sql 来执行更新,也许使用 Merge 语句,然后将其安排为使用 sql server 代理的作业。我也一直在看 SSIS,它看起来适合 ETL 之类的东西。

我只是不确定要使用什么来实现这一点,我希望就应该如何去做这种事情得到一些建议?任何建议将不胜感激。

【问题讨论】:

    标签: sql sql-server ssis replication etl


    【解决方案1】:

    对于那些架构/属性没有改变的表,我仍然强烈推荐复制。

    对于数据和/或关系发生显着变化的表,我建议您开发一个 Service Broker 实现来处理它。使用服务代理 (SB) 的高级方法是:

    Table-->Trigger-->SB.Service >====> SB.Queue-->StoredProc(activated)-->Table(s)
    

    我不会为此推荐 SSIS,除非您想使用诸如拨号导出/导入之类的东西。这对这种事情很好,但恕我直言,对于连续或短期增量数据分发来说太笨拙和麻烦了。

    【讨论】:

    • 我确实需要更改架构并且还需要检查数据,所以我认为复制不适合这种情况。第三方数据库也没有每个表的主键,因此会排除事务复制。服务代理方法是一种可行的解决方案,尽管我将不得不向多个表添加触发器,并且需要更多的工作才能使服务代理解决方案正常工作。我确实分享了您对 SSIS 方法的担忧,但我听说其他人更新他们的 DW 比这更频繁,并假设他们正在使用 SSIS
    • 好吧,SSIS 根本无法很好地处理正在进行的架构更改。这至少是 Service Broker 有机会处理的事情(使用 DDL 触发器作为源)。当源数据库模式和目标数据库模式开始不同时,我不知道还有什么可以做的。
    【解决方案2】:

    尼克,我自己走的是 SSIS 路线。我有每 15 分钟运行一次的作业,这些作业基于 SSIS,并且执行您正在尝试执行的操作。我们有一个庞大的关系数据库,然后我们想使用一个名为 Tableau 的产品在它之上进行复杂的报告。我们很快发现我们的关系模型并没有那么热,所以我用 SSAS 在它上面构建了一个多维数据集,该多维数据集每 15 分钟更新和处理一次。 是的,SSIS 确实给人一种主要用于直接 ETL 工作的光环,但我发现它也可以用于像这样的简单快速工作。

    【讨论】:

    • 感谢您的回复 - 很高兴听到您使用 SSIS 来实现类似的事情。使用 SSIS 的性能如何?您使用了 SSIS 的哪些功能 - 只是您执行的一些 T-SQL 代码还是涉及使用这些数据流转换?
    • 实际上两者都涉及。我使用大量数据流转换来更新维度,并使用一些 T-SQL 组件来清除我在此过程中使用的原始数据表。我在性能方面没有任何问题,也没有人抱怨作业执行时服务器速度变慢。总的来说,到目前为止,我们对 SSIS 感到非常满意。
    • 性能听起来不错。您是否也为此使用临时表?我正在阅读这个主题,并建议使用暂存表并使用分区然后切换到新更新的数据。
    • 是的,我有一个临时表,我填充然后在最后截断。
    【解决方案3】:

    我认为,分期和分区对于您的情况来说太过分了。我现在在 SSIS 中实施同样的事情,但频率为 1 小时,因为我需要花一些时间进行支持活动。我确信使用 SSIS 是一种很好的方法。

    在设计过程中,我想到了另一种实现自定义复制的方法,即自定义变更数据捕获 (CDC) 流程。这样你就可以获得近乎实时的复制,但这是一件棘手的事情。

    【讨论】:

    • 我认为 CDC 仅出现在 2008 版中,我坚持使用 2005 年的源代码,所以没有考虑到这一点。你说分期和分区会太多,你的意思是因为我想要更新的频率?
    • 频率和它可能导致的延迟。如果你考虑成本和收益,你可能不会去。
    猜你喜欢
    • 2019-06-12
    • 2012-06-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2013-06-07
    • 2015-01-12
    • 2011-08-18
    相关资源
    最近更新 更多