我很清楚什么是堆中的转发记录。因为我想将转发记录保持为 0,所以我们决定只更新无法扩展的列。
最近在我的系统上遇到转发记录。
表格设计是这样的:
CREATE TABLE dbo.test (
HashValue BINARY(16) NOT NULL,
LoadTime DATETIME NOT NULL,
LoadEndTime DATETIME NULL,
[other columns that never get updates]
) WITH(DATA_COMPRESSION=PAGE);
插入语句总是带HashValue
AND LoadTime
。我检查了查询日志。
我插入值“9999-12-31”。
现在系统执行这样的更新LoadTime
:
;WITH CTE AS (
SELECT *, COALESCE(LEAD(LoadTime) OVER(PARTITION BY HashValue ORDER BY LoadTime) ,'9999-12-31') as EndTimeStamp
)
UPDATE CTE SET LoadEndTime = EndTimeStamp;
由于该LoadEndTime
列始终被填充,因此在执行更新时,该列在行内不应有任何扩展。它应该是一个就地更新。在那个过程之后我仍然总是收到转发的记录......这对我来说没有意义。
插入语句是这样的:
INSERT INTO dbo.test (HashValue, LoadTime,LoadEndTime)
SELECT HASHBYTES(...), GETDATE(), '1900-01-01'
所以已经有一个虚拟值。即使压缩,日期时间 '1900-01-01 00:00:00' 的固定和可变表示也应该是 8 个字节。