【问题标题】:update result table only when the source table data is changed仅在源表数据更改时更新结果表
【发布时间】:2015-12-13 19:55:01
【问题描述】:

我们有一个结果表,其中包含来自 5-6 个源表的数据。数据以每周为单位显示。我们决定编写一个存储过程并从 SQL Server 作业中调用它,以便每周将数据拉入结果表中。

如果在一周内源表中的任何数据发生更改/更新,我们必须仅在结果表中更新这些记录。现在我们正在考虑两种方法来做到这一点:

  1. 每当源表在同一周内发生更改/更新时,创建触发器以更新结果表。

  2. 使用[modified date] 列来识别源表中的修改记录并更新结果表中的记录。

我的问题是:

  1. 我们是否有任何其他轻量级方法可以在 SQL Server 或 SSIS 中做同样的事情?
  2. 对于每周将数据加载到结果表中,除了 SQL Server 或 SSIS 中的 SQL Server 作业,我们还有其他方法吗?

感谢您的帮助。

【问题讨论】:

  • 您是只关心从一周到下一周的状态,还是需要捕获每周的所有变化?第一个更容易处理计划作业和每个表中的rowversion 列。第二个是触发器可以处理的事情。 “视情况而定”子句:有多少数据?它多久改变一次?读取与写入平衡? ...
  • 有大量数据。由于所有源表都是事务表,因此它会经常更改。我需要捕捉所有的数据变化。
  • 谁能告诉我,我们可以在这些场景中使用 Change Data Capture IN SSIS

标签: sql sql-server tsql ssis


【解决方案1】:

问题的答案:

  1. 考虑Change Data Capture
  2. Windows 任务计划程序可以按计划运行可执行文件,例如 sqlcmd.exe。并且有许多第三方任务/作业调度解决方案。

SSIS 使用 SQL 代理作业进行调度。最终,SSIS、作业和几乎所有解决方案都必须使用 T-SQL 来完成所需的工作。

变更数据捕获略有不同(因此我写了“几乎”)。它的 logreader 或 sp_replcmds 使用内部函数调用来检测(SQL Server 始终记录的)更改,这意味着 CDC 在性能影响方面相对“轻量级”。

对考虑的方法的评论:

  1. 在使用触发器时仔细测试性能和逻辑。触发器 在事务范围内运行,因此它们会增加开销 影响事务性能,并且(如果写得不正确)可以 导致意外回滚。我更喜欢 CDC,而不是这种方法。

  2. 考虑添加rowversion,而不是[修改日期] 列到 4-5 个源表中的每一个。添加 4-5 个二进制 (8) 列 (每个 rowversion 一个)到目标表或另一个表 与目标表具有 1:1 的关系。添加每个 4-5 源表的主键列到目标表还是1:1 桌子。插入源表的主键值及其 rowversion 值到目标表或 1:1 表中。当一个 连接键值的 rowversion 值不同,来源 表的行已被修改。当目标中没有一行时 表或 1:1 表,已将一行插入到源中 桌子。我更喜欢 CDC,而不是这种方法。

【讨论】:

  • 感谢您的解决方案。但我对 CDC 的实施有疑问。我是否需要从源表中插入更新的行并使用 CDC 将其更新到目标表中?
  • 您使用 CDC 来识别更改 - 无需更改现有源表(除非它们不明智地没有主键)。如果不需要更改历史记录,请使用更改跟踪。两者都提供识别行和列更改的功能。您可以使用这些函数为目标表开发/编写自己的插入、更新或删除语句。由于源表未修改,CDC 或 CT 可以轻松利用现有设计。如果表没有主键,请考虑创建一个利用身份属性的代理 PK。
猜你喜欢
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 2020-09-15
  • 2017-05-27
  • 1970-01-01
相关资源
最近更新 更多