我有一个性能问题,非常大的内存授予处理这个包含几NVARCHAR(4000)列的表。事情是这些列永远不会大于NVARCHAR(260).
使用
ALTER TABLE [table] ALTER COLUMN [col] NVARCHAR(260) NULL
Run Code Online (Sandbox Code Playgroud)
导致 SQL Server 重写整个表(并在日志空间中使用 2 倍的表大小),这是数十亿行,只是什么都不改变,不是一个选项。增加列宽没有这个问题,但减少它。
我曾尝试创建约束CHECK (DATALENGTH([col]) <= 520)或CHECK (LEN([col]) <= 260)SQL Server 仍然决定重写整个表。
有没有办法将列数据类型更改为仅限元数据的操作?无需重写整个表?我使用的是 SQL Server 2017(14.0.2027.2 和 14.0.3192.2)。
这是用于重现的示例 DDL 表:
CREATE TABLE [table](
id INT IDENTITY(1,1) NOT NULL,
[col] NVARCHAR(4000) NULL,
CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED (id ASC)
);
Run Code Online (Sandbox Code Playgroud)
然后运行ALTER.