SQL Server IDENTITY(1,1)列不是与UpdatedDate同步生成的



我在基于SQL Server的应用程序中遇到了一个奇怪的情况,我正试图弄清楚在试图解释它时遗漏了什么。

我在表上有一个触发器,每次更新/删除表中的记录时,触发器都会将日志插入到日志表中。Bellow是我最近发现的日志表的一个例子。

ID    UpdatedDate
------------------------------
10    2018-07-06 12:20:54.287
11    2018-07-06 12:20:54.657
12    2018-07-06 12:20:54.703
13    2018-07-06 12:20:54.910
14    2018-07-06 12:20:54.900
15    2018-07-06 12:20:54.953
16    2018-07-06 12:20:55.070
17    2018-07-06 12:20:55.087
18    2018-07-06 12:20:55.100
19    2018-07-06 12:20:55.113
20    2018-07-06 12:20:55.117
21    2018-07-06 12:20:55.143
22    2018-07-06 12:20:55.243
23    2018-07-06 12:20:53.973

如果查看最后一条记录#23,则UpdateDate小于ID较小的其他(较旧(记录的UpdatedDate。这对我来说很奇怪,因为ID列是用IDENTITY(1,1)定义的,这意味着它是单调递增的。因此,ID的值越高,记录就越新,因此UpdatedDate列应该总是在增加,并且记录#23不应该具有较旧的时间戳。

顺便说一句,插入到日志表中只使用GETDATE()作为UpdatedDate列。

这可以解释吗?

我敢肯定你在测量两种不同的东西。updatedDate可能更像是在调用触发器时,甚至是在调用update/delete时。id是指该行实际插入到表中的时间。

因此,您看到的是,较旧的更新/删除会在以后的时间进入日志。我推测这是因为这个过程需要更长的时间——常见的罪魁祸首是更多的行受到影响、页面分割、索引更新和触发器。因为它需要更长的时间,所以较旧的日期会比其他事务记录得晚。

我认为,如果您使用default getdate()作为列,您会看到更多的一致性。

最新更新