将Nvarchar(max)转换为nvarchar(30)的最佳/最有效的方法

时间:2017-12-27 17:01:52

标签: sql sql-server tsql type-conversion

我想知道是否有人可以给我一个问题指针。我认为其他人之前已经经历过这种情况,并且想知道效率最高的是什么。

我的生产数据需要很长时间才能处理,主要是因为我们没有在ID字段上设置索引。

ID字段当前是nvarchar(max),因此无法编入索引。此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)列的名称?

有没有人对什么可能更好有任何建议?

任何指针/帮助都将不胜感激!

1 个答案:

答案 0 :(得分: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)