MIN(__ $ start_lsn)和fn_cdc_get_min_lsn之间的区别?

时间:2013-05-20 18:07:12

标签: sql-server change-data-capture

在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的第一个参数是否有任何问题? (我见过的所有例子都使用了第二个查询中的值)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

就像@Ben所说,这个可以与实际捕获的最早变化不同(早期),例如当一个表首次添加到CDC并且还没有任何变化时。< / p>

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

你应该使用它而不是获得min LSN的其他方式,因为

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

工作流程通常是:

  • 从(您的州)
  • 加载您之前的LSN
  • 查询当前的LSN
  • 查询表的最小可用性
  • 如果上一页&gt;最小可用负载仅更改
  • 否则加载整个表并处理它(不知何故)
  • 将当前LSN保存到(您的州)