0

在 SQL Server 2012 上使用 CDC。

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

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吗?(我见过的所有示例都使用第二个查询中的值)
4

2 回答 2

1

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

于 2013-05-20T19:26:53.023 回答
0

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

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

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

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

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

工作流程一般是:

  • 从(您的州)加载您以前的 LSN
  • 查询当前 LSN
  • 可用于表的查询最小值
  • 如果 prev > min 可用负载仅改变
  • 否则加载整个表并处理它(不知何故)
  • 将当前 LSN 保存到(您的状态)
于 2015-03-26T04:05:57.823 回答