我有一个表,其中包含6400万条记录,我想将某些列的VARCHAR
类型修改为NVARCHAR
。
正常的alter语句需要5个小时才能完成。我无法在生产中运行。
ALTER TABLE [dbo].[Sample] ALTER COLUMN [Name] NVARCHAR(255) NOT NULL.
任何其他比这更快的方法。
没有索引,没有约束,没有触发器,它是一个简单的表,可容纳6400万个数据。
此外,我无法/创建具有NVARCHAR
类型的虚拟表并将数据加载到虚拟表中,重命名实际表或将其删除并将虚拟表重命名为实际表。
答案 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'