【问题标题】:Difference between MIN(__$start_lsn) and fn_cdc_get_min_lsn?MIN(__$start_lsn) 和 fn_cdc_get_min_lsn 之间的区别?
【发布时间】:2013-05-20 18:07:12
【问题描述】:

在 SQL Server 2012 上使用 CDC。

我有一个启用 CDC 的表 (MyTable)。我认为以下两个查询总是会返回相同的值:

SELECT MIN(__$start_lsn) FROM cdc.dbo_MyTable_CT;
SELECT sys.fn_cdc_get_min_lsn('dbo_MyTable');

但他们似乎没有这样做:在我的情况下,第一个返回0x00001EC6000000DC0003,第二个返回0x00001E31000000750001,因此表中的绝对最小值实际上大于fn_cdc_get_min_lsn 返回的值。

我的问题:

  1. 为什么结果不同?
  2. 使用第一个查询中的值作为fn_cdc_get_all_changes_dbo_MyTable 的第一个参数有什么问题吗? (我见过的所有示例都使用第二个查询中的值)

【问题讨论】:

    标签: sql-server change-data-capture


    【解决方案1】:

    我的理解是,第一个返回当前位于 CDC 表中的数据的最旧 LSN,而后者反映了该表何时添加到 CDC。我会注意到,您只想使用最低限度(无论您使用哪种方法)一次,这样您就不会处理重复记录。此外,由于第二种方法从 sys.cdc_tables 获取结果(它的行数很可能比您的 CDC 表少得多),因此效率会更高。

    【讨论】:

    • 那么 fn_cdc_get_min_lsn 会永远返回相同的值吗?
    • 没有。它返回可以为该表查询的最小 LSN,它应该总是
    【解决方案2】:

    sys.fn_cdc_get_min_lsn 返回更改捕获表的最小可用 lsn。

    就像@Ben 所说,这可能与实际捕获的最早更改不同(较早),例如,当一个表首次添加到 CDC 并且还没有任何更改时。

    根据MSDN doco,您应该始终在执行之前使用它来验证您的查询范围,因为更改数据最终会被清除。所以你不会只使用一次 - 你每次都会检查它。

    您应该使用它而不是通过其他方式获取最小 LSN,因为

    • 它会更快(正如 Ben 指出的那样)。 更快可能更快。
    • 这是记录在案的 API。后备表的实现可能会在未来的版本中发生变化等...

    工作流程一般是:

    • 从(您所在的州)加载您以前的 LSN
    • 查询当前 LSN
    • 可用于表的最小查询
    • 如果 prev > 仅最小可用负载变化
    • 否则加载整个表并处理它(以某种方式)
    • 将当前 LSN 保存到(您的州)

    【讨论】:

      猜你喜欢
      • 2012-06-26
      • 1970-01-01
      • 2021-12-25
      • 2020-05-10
      • 2014-09-20
      • 2010-10-28
      • 2015-10-04
      • 2012-08-12
      • 2011-02-18
      相关资源
      最近更新 更多