【问题标题】:What are the best practices for detecting changed rows for a data feed?检测数据馈送的更改行的最佳做法是什么?
【发布时间】:2011-09-26 07:16:26
【问题描述】:

我正在研究管理每周向第 3 方 OLAP 服务提供数据的最佳做法。分析数据库将使用完整的数据转储进行初始化。随后的每周提要将提供新的和更新的行。数据来源于 SQL Server 2005 数据库。

检测新行和更新行的首选方法是什么?

  1. 在插入和更新时触发修改的日期字段,并获取大于上次提要提取的日期;或

  2. 源表上的时间戳列,并抓取时间戳大于上次提要提取的行;或

  3. 一些我没想到的好主意...

【问题讨论】:

    标签: sql-server timestamp datafeed


    【解决方案1】:

    这取决于您如何定义更改的行。

    数字 2 有效,但对行的任何更改都会更改时间戳,即使是实际上不会更改任何内容的更新(例如将值从 1 更新为 1)。听起来很傻,谁会这样做?但是当你使用动态代码时很容易做到。

    可以修改数字1,以确保触发器中插入的表和删除的表之间存在差异,并修复选项2的问题。

    但是,假设您有三个不同的提要,每个提要都包含可能位于相关表中的不同列,并且您只想在其中一个实际发生更改时发送。现在,触发器对您的提要不够具体。我们使用更改数据跟踪来识别自上次发送日期以来哪些行发生了更改(我们将其存储为所有 SSIS 包的一部分),然后计算特定列的行哈希数据以查看我们感兴趣的数据是否实际更改。我还看到人们使用发送内容的历史表,然后将这些值(如果您只对表中的一两个字段感兴趣)与更改数据跟踪表中实际更改的值进行比较。当你有这样一个特定的需求时,你最终会得到一个相当复杂的系统来支持它(我只是给你一个粗略的想法)。

    【讨论】:

    • 感谢 cmets。我相信我们的系统是需要寻找特定列的变化。当您说“我们使用更改数据跟踪来识别”更改的行会这样工作吗?每个提要存储 RowId|HashOfRelevantColumnData。然后使用时间戳来识别更改的行,然后查看 RowId|HashOfRelevantColumnData 表以确定我是否真的要包含该行?再次感谢。
    【解决方案2】:

    正如 HLGEM 所说,时间戳不是一个好主意。触发器是一个不错的选择,但这里还有一个问题——您打算如何存储更改?只是将所有记录克隆到历史表?答案取决于你有多大的存储空间。如果是,或者如果您必须仅存储有限的历史记录(例如,只有 1 年的历史记录) - 您可以这样做。但是,如果您的存储空间有限,或者如果您想将所有更改存储在一个表中,我建议使用我更喜欢的方法:使用 OUTPUT 子句并将仅更改的列值存储在一个表中作为 XML。我在我的博客中描述了这种技术:part_1,part_2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-06
      • 2016-03-29
      • 2018-04-08
      • 2013-05-08
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 2015-03-08
      相关资源
      最近更新 更多