我在表中有一列,以便它不再是NVARCHAR(256),而是NVARCHAR(MAX)。我知道这个命令(ALTER TABLE ALTER COLUMN NVARCHAR(MAX))。我的问题实际上是关于中断。我必须在生产环境中这样做,我想知道是否在实时环境中执行此操作时,可能会对用户的使用造成一些干扰。那时正在使用数据库的用户会被启动吗?此操作可能需要很长时间吗?ALTER TABLE ALTER COLUMN是否中断正在进行的数据库访问?
感谢,
萨钦
我在表中有一列,以便它不再是NVARCHAR(256),而是NVARCHAR(MAX)。我知道这个命令(ALTER TABLE ALTER COLUMN NVARCHAR(MAX))。我的问题实际上是关于中断。我必须在生产环境中这样做,我想知道是否在实时环境中执行此操作时,可能会对用户的使用造成一些干扰。那时正在使用数据库的用户会被启动吗?此操作可能需要很长时间吗?ALTER TABLE ALTER COLUMN是否中断正在进行的数据库访问?
感谢,
萨钦
我删除了我以前的答案,声称这将是一个元数据唯一的变化,并提交一个完全不同的结论的新的答案!
虽然在更改为nvarchar(max)
的情况下,对于更改为高达nvarchar(4000)
的情况,此操作看起来非常昂贵。 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服务器内部查看器的页面可以看到显示
白色41 00 ...
从以前版本的浪费空间柱。
的意见必须是 - 做一个备份,如果你能做到这一点下班时间。
之前已经说过,我不希望你的数据库被改变所干扰,并且它不需要很长时间。
你的客户端软件呢?这将如何受到影响?
它应该没问题,除非你有大量的行(百万)..是的,它会在表更新时锁定表,但挂起的请求只会等待它。
任何正在进行的查询都不会受到影响。数据库必须等到可以改变之前创建一个独占表锁。
更新完成后,没有查询可以使用该表,因此如果表中有很多记录,数据库对于任何需要使用该表的查询都将无法响应。
这不是数据操作的大小。表中的行数不会影响事物。 –
@Martin Smith:我不太确定... varchar(n)类型与'varchar(max)'不一样。数据库可能会选择在表格外部存储一些较长的值。 – Guffa
或者至少我不认为它应该是,但测试似乎表明它是(+1)。 'ALTER TABLE X ALTER COLUMN Bar NVARCHAR(4000)null'是即时的,但'NVARCHAR(max)'绝对不是,我可以在被取出的页面上看到很多'U'锁和Extents和'X'锁。在SQL Server 2008内部版本中,它指出,对于'max'数据类型,如果内容的实际长度小于'8000',则应将其视为与'nvarchar(x)'相同。 –