插入一个大表,其中PK不是一个标识

时间:2016-02-08 11:27:12

标签: sql sql-server database tsql sql-server-2012

我将旧数据库中的数据导入新数据库。其中一个表有超过3000万行,我必须从OLD DB获得相同的PK值。迁移后,我必须开发用于将数据插入该表的存储过程。我的问题是:我应该将PK(迁移后)设置为Identity还是当我插入数据时,找到PK的Max值并将其递增1,然后插入? 如果我应该使用第一种方法,我该怎么办?我尝试通过Management Studio进行此操作,但由于超时异常,它总是失败。如果我应该使用第二种方法,它是否是线程安全的并且会降低性能吗?

谢谢!

此致 Turik

1 个答案:

答案 0 :(得分:0)

建议的方法是在加载数据时加载所有索引(包括主键),因为它会加快负载并减少事务日志的负载。但是,您需要确保在加载之前将IDENTITY属性添加到新表中,并使用SET IDENTITY_INSERT .... ON允许您插入旧的标识值。

对于此示例,我们假设这是您的目标表:

CREATE TABLE dbo.YourTable(YourTableId INT IDENTITY(1,1), SomeData INT)

然后,您需要使用IDENTITY_INSERT...ON以确保可以从源表中插入数据:

SET IDENTITY_INSERT dbo.YourTable ON

--copy data from source table
INSERT INTO dbo.YourTable
(YourTableId, SomeData)
SELECT 1,1
UNION
SELECT 2,2

迁移数据后,您需要再次关闭IDENTITY_INSERT

SET IDENTITY_INSERT dbo.YourTable OFF

添加主键:

ALTER TABLE dbo.[YourTable] ADD CONSTRAINT PK_YourTable_YourTableID PRIMARY KEY CLUSTERED (YourTableID) 

然后重新设置主键,RESEED值等于当前最大PK值

DBCC CHECKIDENT ('[YourTable]', RESEED, 2)

运行此命令后,将为YourTableId

插入一条值为3的记录
INSERT INTO dbo.YourTable
SELECT 3