Sql 将Nvarchar(最大值)转换为Nvarchar(30)的最佳/最有效方法
我想知道是否有人能给我一个关于这个问题的指示。我想其他人以前也经历过这种情况,并且想知道什么是最有效的 我处理生产数据需要很长时间,主要是因为我们没有在ID字段上设置索引 ID字段当前是nvarchar(max),因此无法对其编制索引。这个ID永远不会超过30个字符,因此我想将数据类型更改为nvarchar(30)。但是,我注意到使用以下语句:Sql 将Nvarchar(最大值)转换为Nvarchar(30)的最佳/最有效方法,sql,sql-server,tsql,type-conversion,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 对
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)
我建议将数据复制到另一个位置,截断表,更改数据类型,然后重新插入数据。您将希望以最低级别或使用
批量插入来完成最后一部分的日志记录。谢谢,我将尝试此方法,然后返回给您,看看是否有效!