2017-08-24 98 views
0

我有一個包含6億多條記錄和NVARCHAR(MAX)列的表。更改大型SQL Server數據庫中的列大小會導致問題

我需要的列大小變更爲固定大小,但我通常有兩個選擇與這個大DB:使用SSMS的設計師,這需要很長的時間,也許永遠無法完成它

  • 變化它使用
  • 變化Alter Column,但隨後的數據庫不後工作,也許是因爲我們有幾個指標

我的問題是:什麼是可能的解決方案,以實現無差錯預期的效果?

注:我使用Azure上的SQL Server和這個數據庫是在生產

謝謝

澄清:其實,我有我想要把

新的長度範圍內的所有當前數據
+2

'但隨後的數據庫無法正常工作後that'請詳細總是和張貼任何錯誤,文字 – TheGameiswar

+0

你想傳遞給固定長度的列NCHAR(m),或者你想要的只是將最大可能大小更改爲固定值,但將列的長度保留爲可變長度(我的意思是,從nvarchar(max)傳遞給nvarchar (M))? – sepupic

回答

1

從未在Azure上做過這一點,但是在SQL Server上做了上億行。

我將添加一個所需大小的新列,當然允許空值並創建所需的索引。 之後,我會更新大塊這個新的列修剪/轉換舊的列值爲新的。畢竟,刪除舊列上的索引並將其刪除。使用SSMS的設計師,這需要很長的時間 也許永遠也

+0

非常感謝!有沒有辦法從舊列快速複製到新列?我已經擁有所需長度的所有數據 – Techy

+0

'update table set newCol = oldCol其中indexChild在initChunkValue和endChunkValue之間'這將防止事務日誌消化 – Horaciux

1

更改完成

什麼SSMS會做幕後是

  • 創建一個新表您的列的新數據類型
  • 將原始表中的所有數據複製到新表
  • 重命名新與舊名稱
  • 降舊錶
  • 表重新創建新表的所有索引

當然這需要一定的時間來複制你的所有「600多萬條記錄」。 此外,整個表將鎖定數據加載時間with (holdlock, tablockx)

更改它使用ALTER列,但隨後的數據庫不 的是,也許是因爲我們經過努力幾個指標

這是不正確的。

如果涉及到任何索引,並且只有具有該字段廣告的索引included專用於其數據類型nvarchar(max),則服務器會給您一個錯誤,並且在您刪除該索引之前不會執行任何操作。如果沒有索引受到影響,它就不能「在那之後不起作用,也許是因爲我們有幾個索引」。

請再想一想您想要實現更改該列的類型。如果你認爲你會獲得一些空間,那麼這是錯誤的。

nvarchar(max)傳遞給nchar(max)(從可變長度類型爲固定長度類型)你的數據會佔用更多的空間比現在因爲你要存儲固定數目字節,即使該列null或1-2-3之後字符。

如果你只是想改變max到水木清華一樣,例如8000,你一無所獲,因爲這不是真正的數據大小,但只有最大尺寸的數據可以有。如果你的字符串大小是足夠小,你nvarchar(max)已經存儲爲in-row data,而不是LOB data,因爲它是與ntext

+0

所有100%正確,已經添加了一個。我想提出的一點是,改變爲固定長度的VARCHAR可能不是爲了消除空間,而是爲了防止某人輸入LOB數據。如果系統的功能沒有必要,我肯定會停止發生這種情況。 –

+0

非常感謝,我真的想將它轉換爲nvarchar(xxx)。這樣做之前爲我們節省了不少專欄的空間。 – Techy

相關問題