将Nvarchar(max)转换为nvarchar(30)的最佳/最有效的方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Nvarchar(max)转换为nvarchar(30)的最佳/最有效的方法相关的知识,希望对你有一定的参考价值。
我想知道是否有人能给我一个问题的指针。我假设其他人之前已经经历过这种情况,并且想知道什么是最有效的。
我的生产数据处理时间相当长,主要是因为我们没有在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)列的名称?
有没有人对什么可能更好有任何建议?
任何指针/帮助将不胜感激!
答案
我们通过创建一个空的新列(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)
以上是关于将Nvarchar(max)转换为nvarchar(30)的最佳/最有效的方法的主要内容,如果未能解决你的问题,请参考以下文章
将 FLOAT 转换为 NVARCHAR - 不同的小数位数
不允许从数据类型 nvarchar 到 varbinary(max) 的隐式转换
不允许从数据类型 nvarchar 到 varbinary(max) 的隐式转换