我在表中有一列,因此它不再是NVARCHAR(256),而是NVARCHAR(MAX)。我知道执行此操作的命令(ALTER TABLE ALTER COLUMN NVARCHAR(MAX))。我的问题实际上是关于破坏。我必须在生产环境中这样做,我想知道当我在实时环境中执行此操作时,可能会对用户的使用造成一些中断。当时正在使用数据库的用户是否会被启动?这项行动可能需要太长时间吗?
谢谢,
萨钦
答案 0 :(得分:3)
我删除了之前的回答,声称这只会改变元数据并提交一个完全不同的新结果!
虽然在更改为nvarchar(4000)
的情况下更改为nvarchar(max)
的情况属实,但操作似乎非常昂贵。 SQL Server将添加一个新的可变长度列并复制以前存在的数据,这可能意味着耗时的阻塞操作导致许多页面拆分以及内部和逻辑碎片。
这可以从下面看到
CREATE TABLE T
(
Foo int IDENTITY(1,1) primary key,
Bar NVARCHAR(256) NULL
)
INSERT INTO T (Bar)
SELECT TOP 4 REPLICATE(CHAR(64 + ROW_NUMBER() OVER (ORDER BY (SELECT 0))),50)
FROM sys.objects
ALTER TABLE T ALTER COLUMN Bar NVARCHAR(MAX) NULL
然后查看SQL Server Internals Viewer中的页面显示
白色41 00 ...
是以前版本的列所浪费的空间。
答案 1 :(得分:2)
任何正在进行的查询都不会受到影响。数据库必须等到它可以进行独占表锁定才能被修改。
更新完成后,没有任何查询可以使用该表,因此如果表中有大量记录,则数据库似乎无法响应需要使用该表的任何查询。
答案 2 :(得分:0)
建议必须是 - 进行备份,如果可以,请在数小时内完成。
话虽如此,我不希望您的数据库因更改而中断,也不会花很长时间。
您的客户端软件怎么样?这将如何受到影响?
答案 3 :(得分:0)
应该没问题,除非你有大量的行(数百万)..是的,它会在更新时锁定表,但待处理的请求只会等待它。