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

2019-10-30 07:23发布

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

Answer 1:

我的理解是,第一个返回的最古老的LSN这是目前在CDC表,当表中加入CDC后者反映的数据。 我会注意的,虽然你会只想用最小的(你去任何一种方法),一次让你不处理重复的记录。 此外,由于第二种方法会从sys.cdc_tables它的结果(这很可能比你的CDC表确实少了许多行),这将是更有效的。



Answer 2:

sys.fn_cdc_get_min_lsn返回的变化捕捉表中的最小可用 LSN。

像@Ben说,这可能是不同的,从最早的变化(早)实际拍摄的,例如,当一个表第一次添加到CDC和再也没有出现过任何更改。

作为每MSDN DOCO你应该总是用这个来验证之前执行查询的范围,因为变化的数据最终将得到清理。 所以,你不仅可以使用此一次-你会检查每一次。

你应该使用这个,而不是让最小LSN其他方式,因为

  • 这将是更快(如奔指出)。 快得多可能。
  • 它是这样做的记录的API。 依托表的实现可能在将来的版本等改变...

工作流程一般为:

  • 从加载你以前的LSN(你的状态)
  • 查询当前LSN
  • 查询最小可用的表
  • 如果只有一个先前>分钟可用负载变化
  • 否则加载整个表和处理它(在某种程度上)
  • 当前LSN保存到(你的状态)


文章来源: Difference between MIN(__$start_lsn) and fn_cdc_get_min_lsn?