2017-12-27 2601 views
1

我想知道如果任何人都可以給我這個問題的指針。我假設其他人以前經歷過這種情況,並且想知道什麼是最有效的。最佳/最有效的方式爲nvarchar(最大)轉換到爲nvarchar(30)

我有一個正在相當長的處理,主要是因爲我們還沒有設置一個ID字段索引生產數據。

ID字段是目前爲nvarchar(最大),所以它不能被索引。此ID不超過30個字符,因此我想將數據類型更改爲nvarchar(30)。但是,我注意到使用諸如以下語句:

ALTER TABLE [dbo].[Table] ALTER COLUMN [Column1] NVARCHAR (30) NOT NULL 

已經爲較小的表佔用大量時間。我擔心它可能不適用於較大的表格,因爲DiskIO對於較小的表格已經非常高。

請問以下是更快,可能它的工作?

  • 使用nvarchar(30)數據類型創建一個新列。
  • 然後將數據從nvarchar(max)列複製到nvarchar(30)列。
  • 然後刪除nvarchar(max)列。
  • 然後將nvarchar(30)列重命名爲nvarchar(max)列的名稱?

有沒有人有任何建議,什麼可能是更好?

任何指針/幫助將不勝感激!

+0

我會建議將數據複製到另一個位置,截斷表,數據類型的改變,並重新插入數據。你需要做最後一部分的日誌記錄或使用'bulk insert'。 –

+0

可能的重複[SQL Server性能改變表alter column更改數據類型](https://stackoverflow.com/questions/4311559/sql-server-performance-for-alter-table-alter-column-change-data-類型) – Joey

回答

2

我們通過創建一個空的新列(NULL)和批量更新解決了類似的問題

update top (5000) myTable --parentheses are mandatory, set a small number to avoid transaction log issues 
set newCol = oldCol -- or left(oldCol,30) not sure your data 
where newCol is null 

go 10000 --runs 10,000 times, set accordingly to your rows amount, this covers 50 million rows(5,000x10,000) 
+0

謝謝,我會試試這個並且回覆你,看它是否有效! – Mark

+0

這個作品,謝謝! – Mark

+0

我很高興它幫助!只是好奇,有多少行? – Horaciux