在SQL Server中修改列数据类型的最佳方法是什么?

时间:2018-07-11 12:51:25

标签: sql sql-server sql-server-2012 sql-server-2008-r2 ssms-2014

我有一个表,其中包含6400万条记录,我想将某些列的VARCHAR类型修改为NVARCHAR

正常的alter语句需要5个小时才能完成。我无法在生产中运行。

ALTER TABLE [dbo].[Sample] ALTER COLUMN [Name] NVARCHAR(255) NOT NULL.

任何其他比这更快的方法。

没有索引,没有约束,没有触发器,它是一个简单的表,可容纳6400万个数据。

此外,我无法/创建具有NVARCHAR类型的虚拟表并将数据加载到虚拟表中,重命名实际表或将其删除并将虚拟表重命名为实际表。

3 个答案:

答案 0 :(得分:0)

您可能会发现将数据存储到临时表,截断并重新插入数据的速度更快:

select *
into temp_sample
from sample;

truncate table sample;

alter table [dbo].[Sample] alter column [Name] NVARCHAR(255) NOT NULL;

insert into sample
    select *
    from temp_sample;

答案 1 :(得分:0)

我从未尝试过使用sql-server,但是对于oracle数据库,您可以使用PARALLEL命令 https://docs.oracle.com/cd/E11882_01/server.112/e25523/parallel002.htm

ALTER TABLE <table_name> PARALLEL 32;

我认为sql-server使用MAXDOP,但是我不确定它是如何工作的 SQL Server : ALTER TABLE ADD COLUMN MAXDOP=1

答案 2 :(得分:0)

尝试以下方法。用NVARCHAR(255)添加一个新列,并逐步更新该列。这不会给内存带来任何负担。

ALTER TABLE [dbo].[YourTable] ADD [NewCol] NVARCHAR(255) NULL;
GO

WHILE 1=1
BEGIN
    UPDATE TOP (5000) [dbo].[YourTable]
    SET NewCol = OldCol
    WHERE NewCol IS NULL
    IF @@ROWCOUNT = 0
        BREAK
END
ALTER TABLE [dbo].[YourTable] DROP COLUMN [OldCol]
EXEC sp_rename '[dbo].[YourTable].NewCol','OldCol'