2011-10-12 163 views
2

我在表中有一列,以便它不再是NVARCHAR(256),而是NVARCHAR(MAX)。我知道这个命令(ALTER TABLE ALTER COLUMN NVARCHAR(MAX))。我的问题实际上是关于中断。我必须在生产环境中这样做,我想知道是否在实时环境中执行此操作时,可能会对用户的使用造成一些干扰。那时正在使用数据库的用户会被启动吗?此操作可能需要很长时间吗?ALTER TABLE ALTER COLUMN是否中断正在进行的数据库访问?

感谢,

萨钦

回答

3

我删除了我以前的答案,声称这将是一个元数据唯一的变化,并提交一个完全不同的结论的新的答案!

虽然在更改为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服务器内部查看器的页面可以看到显示

Screenshot

白色41 00 ...从以前版本的浪费空间柱。

0

的意见必须是 - 做一个备份,如果你能做到这一点下班时间。

之前已经说过,我不希望你的数据库被改变所干扰,并且它不需要很长时间。

你的客户端软件呢?这将如何受到影响?

0

它应该没问题,除非你有大量的行(百万)..是的,它会在表更新时锁定表,但挂起的请求只会等待它。

1

任何正在进行的查询都不会受到影响。数据库必须等到可以改变之前创建一个独占表锁。

更新完成后,没有查询可以使用该表,因此如果表中有很多记录,数据库对于任何需要使用该表的查询都将无法响应。

+0

这不是数据操作的大小。表中的行数不会影响事物。 –

+0

@Martin Smith:我不太确定... varchar(n)类型与'varchar(max)'不一样。数据库可能会选择在表格外部存储一些较长的值。 – Guffa

+0

或者至少我不认为它应该是,但测试似乎表明它是(+1)。 'ALTER TABLE X ALTER COLUMN Bar NVARCHAR(4000)null'是即时的,但'NVARCHAR(max)'绝对不是,我可以在被取出的页面上看到很多'U'锁和Extents和'X'锁。在SQL Server 2008内部版本中,它指出,对于'max'数据类型,如果内容的实际长度小于'8000',则应将其视为与'nvarchar(x)'相同。 –