2017-12-27 704 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