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
。
我的问题:
- 为何结果不同?
- 有没有使用第一个查询作为第一个参数值的任何问题
fn_cdc_get_all_changes_dbo_MyTable
? (我见过的所有示例使用值从第二查询)
我的理解是,第一个返回的最古老的LSN这是目前在CDC表,当表中加入CDC后者反映的数据。 我会注意的,虽然你会只想用最小的(你去任何一种方法),一次让你不处理重复的记录。 此外,由于第二种方法会从sys.cdc_tables它的结果(这很可能比你的CDC表确实少了许多行),这将是更有效的。
sys.fn_cdc_get_min_lsn返回的变化捕捉表中的最小可用 LSN。
像@Ben说,这可能是不同的,从最早的变化(早)实际拍摄的,例如,当一个表第一次添加到CDC和再也没有出现过任何更改。
作为每MSDN DOCO你应该总是用这个来验证之前执行查询的范围,因为变化的数据最终将得到清理。 所以,你不仅可以使用此一次-你会检查每一次。
你应该使用这个,而不是让最小LSN其他方式,因为
- 这将是更快(如奔指出)。 快得多可能。
- 它是这样做的记录的API。 依托表的实现可能在将来的版本等改变...
工作流程一般为:
- 从加载你以前的LSN(你的状态)
- 查询当前LSN
- 查询最小可用的表
- 如果只有一个先前>分钟可用负载变化
- 否则加载整个表和处理它(在某种程度上)
- 当前LSN保存到(你的状态)