SQL Server 2012,Web中有下表:
CREATE TABLE [dbo].[MyTable]
(
[Id] INT IDENTITY (1, 1) NOT NULL,
[Created] DATETIME DEFAULT (getdate()) NOT NULL,
[RefId] INT NULL,
[Name] NVARCHAR (128) NULL,
[Email] NVARCHAR (128) NULL,
[ImageUrl] NVARCHAR (256) NULL,
[Url] VARCHAR (256) NULL,
[Age] TINYINT NULL,
[Country] VARCHAR (6) NULL,
[Location] NVARCHAR (192) NULL,
[People] INT NULL,
[Categories] NVARCHAR (128) NULL,
[Block] BIT DEFAULT ((0)) NOT NULL,
[GeneratedRevenue] INT NULL,
[IsFemale] BIT DEFAULT ((1)) NULL,
[HasInstalled] BIT NULL,
[Keywords] VARCHAR (128) NULL,
[Brands] NVARCHAR (512) NULL,
[Source] TINYINT NULL,
[Alias] VARCHAR (65) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
据我所知,总大小应该是3175字节;但在更新表时,经常会得到以下错误:
无法创建大于允许的最大行大小8060的8068行。
上述结果如何导致一行大小为8068?
编辑:我应该指出,这个表已经被修改了,使用了更改跟踪,并且有四个索引。
此外,如果我将内容复制到具有相同定义的新表中,则暂时不会出现错误,但请返回。
发布于 2017-08-15 14:40:48
你说你使用变更跟踪。您是否忽略了更改跟踪的版本控制部分,并通过执行以下操作重置条目?
ALTER TABLE dbo.MyTable disable change_tracking
ALTER TABLE dbo.MyTable enable change_tracking
如果是这样的话,你可能有个嫌疑犯。每次重新启用更改跟踪时,更改跟踪都会在幕后添加一个8位列,如果更改跟踪已经存在,则删除该列。因为删除列只是一种元操作,因此可能会有大量掉落的8位列隐藏在幕后,这取决于重新启用更改跟踪的频率。
要检查这一点,请查看system_internals_partition_columns
视图,并查看是否有大量的is_dropped
列。可能有更多的原因有很多,但是这种使用变更跟踪的方式就是其中之一。
我看到Rusanu在评论(rusanu.com/2011/10/20/sql-server-table-columns-under-the-hood)中链接到一篇很好的文章:他列出的查询应该是您需要查看的内容,如果是这样的话。
编辑:如果需要删除已删除的列,则可以为有许多已删除列的表重新生成聚集索引。这意味着重新构建MyTable
的聚集索引将减轻您的症状。
https://stackoverflow.com/questions/45694198
复制相似问题