【发布时间】:2013-09-30 22:00:23
【问题描述】:
我正在尝试向表中插入大量记录。 这是场景:
SQL Server 2008(数据库为 2005)
目标表具有聚集索引 (PK)。该字段应该是一个身份,但是数据库的开发人员(我们无法更改它,因为它会影响程序)将其创建为一个整数。每次程序需要向表中添加一行时,查看最大 id(在这种情况下为
historyno)并求和。-
当我们需要同时插入大量记录时,这会影响我们的性能,因此我们创建了一个流程来在生产时间之外从临时表 (
AKT_ES_CampTool_TempHist) 中插入行。 问题是,在一小时内,它只插入了 8K 行。考虑到我们需要插入超过 120K,我们用完了几个小时。
我们使用的代码如下。请,如果有人有任何改进它的想法,将不胜感激。
DECLARE @HistNo AS INT
WHILE EXISTS (SELECT * FROM AKT_ES_CampTool_TempHist WHERE Inserted = 0)
BEGIN
SELECT @HistNo=MIN(HistoryNo) FROM AKT_ES_CampTool_TempHist WHERE Inserted = 0
INSERT INTO NOVADB.dbo.niHist (
HistoryNo,ObjectType,ObjectNo,SubNo,ReferenceNo,
Time,Type,Priority,Collector,Code,
Action,RemainingAmount,Obliterated,SubType,ActSegment,
Data,FreetextData,quantity
)
SELECT
(SELECT max(historyNo)+1
FROM NOVADB..niHist),ObjectType,ObjectNo,SubNo,ReferenceNo,
Time,Type,Priority,Collector,Code,
Action,RemainingAmount,Obliterated,SubType,ActSegment,
Data,FreetextData,quantity
FROM AKT_ES_CampTool_TempHist
WHERE HistoryNo=@HistNo
UPDATE AKT_ES_CampTool_TempHist
SET Inserted=1
WHERE HistoryNo=@HistNo
END
【问题讨论】:
-
忘记说Temp表上的“HistoryNo”只是一个ID,与主表上的HistoryNo无关。
标签: sql-server performance loops insert while-loop