2011-10-12 129 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)'相同。 –