我已经在 MS SQL2008R2 上的表 t1 上设置了 SQL Server 更改跟踪。在事务中,我向其中插入一行并更新它“n”次。当我检查更改跟踪表中的行数时,它显示“n”行,而 syscommitab 仅显示 1 行。由于更改跟踪机制是一种同步机制并且根据文档,预计仅跟踪事务中发生的“净更改”,为什么更改跟踪表显示“n”行而不是仅显示 1 行?下面是用于检查行数的 SQL。
SELECT sct1.name as CT_schema,
sot1.name as CT_table,
ps1.row_count as CT_rows,
ps1.reserved_page_count*8./1024. as CT_reserved_MB,
sct2.name as tracked_schema,
sot2.name as tracked_name,
ps2.row_count as tracked_rows,
ps2.reserved_page_count*8./1024. as tracked_base_table_MB,
change_tracking_min_valid_version(sot2.object_id) as min_valid_version
FROM sys.internal_tables it
JOIN sys.objects sot1 on it.object_id=sot1.object_id
JOIN sys.schemas AS sct1 on
sot1.schema_id=sct1.schema_id
JOIN sys.dm_db_partition_stats ps1 on
it.object_id = ps1. object_id
and ps1.index_id in (0,1)
LEFT JOIN sys.objects sot2 on it.parent_object_id=sot2.object_id
LEFT JOIN sys.schemas AS sct2 on
sot2.schema_id=sct2.schema_id
LEFT JOIN sys.dm_db_partition_stats ps2 on
sot2.object_id = ps2. object_id
and ps2.index_id in (0,1)
WHERE it.internal_type IN (209, 210)
and (sot2.name='t1' or sot1.name='syscommittab')
以上 SQL 由https://www.brentozar.com/archive/2014/06/performance-tuning-sql-server-change-tracking/提供
变更跟踪监视每一个 DML 操作;它没有交易的概念。因此,如果您更改一行 5 次,无论是否在事务中,您都将获得 5 行。来自微软的文档:
它不包含任何比这更复杂的逻辑(比如只记录净变化)。您当然可以使用更改跟踪功能而不是直接查询 CT 表来确定净更改。您可以通过在查询中分组来手动折叠更改跟踪表中的重复行,或者更改数据捕获可能更符合您的要求?
如果你想要事务感知的东西并且只记录净变化,你可以看看时态表。不过,您将不得不迁移到这十年(2016 年或 2017 年)生产的 SQL Server 版本。