我有两个这样的表:
Table1 Table2
----------------------------------
Table1Id IDENTITY Table2Id
Table2Id NOT NULL SomeStuff
SomeOtherStuff
在它们之间有一个外键约束,Table2Id是关键。这意味着,在插入其相关的Table1行之前,需要先插入Table2行(这是一种“先有鸡还是先有蛋”的问题)。加载两个表的过程是通过批量集合操作完成的,这意味着我有一个@temp表中包含大量Table1和Table2的数据,该表使用一个IDENTITY列来跟踪这些数据。目前,我的插入操作如下所示(为简洁起见省略了事务和错误处理):
DECLARE @currentTable2Id INT
SET @currentTable2Id = IDENT_CURRENT('dbo.Table2')
INSERT INTO dbo.Table2 WITH (TABLOCKX)
( SomeStuff,
SomeOtherStuff
)
SELECT WhateverStuff,
WhateverElse
FROM @SomeTempTable
ORDER BY SomeTempTableId
INSERT INTO dbo.Table1
( Table2Id )
SELECT @currentTable2Id + SomeTempTableId
FROM @SomeTempTable
ORDER BY SomeTempTableId
这个工作很好,插入后关系都正常。但是由于使用了,我们经常会遇到人们等待对方查询结束的情况,无论是这个“加载”查询还是其他的UPDATES和INSERTS(在selects上我使用)。项目的性质要求加载大量数据,因此有时这个过程可能运行20-30分钟。关于性能,我无能为力,相信我,我已经尝试过。
我不能使用,因为DBAs不允许用户在生产中发出此命令,而且我认为使用也需要。有没有办法在不使用的情况下进行这种插入?
merge
和output
来完成任务。在SQL Server 2005中,我会使用循环(一次处理Table2
中的一行)或者在Table2
中添加一个额外的列来保存暂存表中的ID,然后在插入到Table1
时使用该值进行连接。https://dev59.com/MW435IYBdhLWcg3whQg5 - Mikael Eriksson