【发布时间】:2011-07-03 15:28:25
【问题描述】:
表触发器在什么情况下会导致行尾增加14字节进行行版本控制?
“数据行中使用的空间”部分on this page 明确指出“每个数据库行最多可以在行的末尾使用 14 个字节用于行版本控制信息……这 14 个字节是第一次添加该行被修改,或插入新行时,在任何这些条件下... 表有触发器。"
这在我的测试中没有发生(下面的脚本)。查看数据页面时,我看不到快照隔离下出现的任何版本信息。我是否可以安全地假设数据页上的行永远不会因为触发器在表上而被这 14 个字节膨胀?如果没有,什么时候会发生?
CREATE DATABASE D2
GO
ALTER DATABASE D2 SET ALLOW_SNAPSHOT_ISOLATION OFF
USE D2;
GO
CREATE TABLE T1
(
F1 INT IDENTITY(1,1) PRIMARY KEY,
F2 INT,
V1 VARCHAR(100)
)
INSERT INTO T1
SELECT TOP 80 ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS F2,
REPLICATE(CHAR((ROW_NUMBER() OVER (ORDER BY (SELECT 0) -1) % 26) + ASCII('A')),100) AS V1
FROM sys.all_columns
GO
CREATE TRIGGER TR
ON T1
AFTER INSERT,DELETE,UPDATE
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM inserted
END
GO
UPDATE T1 SET F2=F2+1
GO
DECLARE @DBCCPAGE nvarchar(100)
SELECT TOP 1 @DBCCPAGE = 'DBCC PAGE(''D2'',' + CAST(file_id AS VARCHAR) + ',' + CAST(page_id AS VARCHAR) + ',3)'
FROM T1
CROSS APPLY sys.fn_PhysLocCracker(%%physloc%%)
DBCC TRACEON(3604)
EXEC (@DBCCPAGE)
GO
【问题讨论】:
-
这 14 个字节没有被追加到行,因为
ALLOW_SNAPSHOT_ISOLATION设置为OFF你不需要打开它来追加行版本控制数据吗? -
@Barry - 似乎是这样。我只是想弄清楚我的问题中的链接在说什么。不知道为什么/何时有触发器会有所作为。在我读过的一本 SQL Server 书中也提到了这一点,但没有额外解释,我最好的猜测是它只是在谈论
inserted/deleted伪表,但不确定为什么这值得在Space Used in Data Rows部分中添加条目. -
可能是由于 SQL2K5 中对触发器填充已删除表的方式所做的更改。用于扫描事务日志的触发器,已更改为使用行级版本控制来提高性能。请参阅this article,尤其是标题
Additional SQL Server 2005 Features utilizing Row Level Versioning之后的段落 -
@Barry - 那篇文章没有回答为什么我在测试中看不到任何版本信息的问题。原来这取决于表定义。
标签: sql-server sql-server-2008 triggers