2012-08-14 62 views
0

我正在处理数据('事件')并将结果插入表中以用于报告目的。 数据被批量插入,所以我使用存储过程。是否正在使用SCOPE_IDENTITY()影响我的批处理插入的性能?

的各种事件类型有普通和特殊字段,以便在INSERT语句看起来是这样的:

INSERT INTO [Event](EventID, ...) VALUES(@EventID, ...) 
INSERT INTO [FileEvent](EventID, ...) VALUES(@EventID, ...) 

以1:事件和FileEvent之间一对一的关系。

EventID用于由原始数据提供。最近,我不得不将EventID列修改为IDENTITY列(在原始数据中复制EventIDs,因此无法再将其用作输入)。 INSERT语句现在看起来是这样的:

INSERT INTO [Event](...) VALUES(...) 
declare @EventID int 
SET @EventID = SCOPE_IDENTITY() 
INSERT INTO [FileEvent](EventID, ...) VALUES(@EventID, ...) 

这工作得很好,但我已经可以看到业绩明显下降的数据插入到批处理。例如,我提供ID的INSERT在15分钟内完成,其中使用IDENTITY和SCOPE_IDENTITY()的INSERT在18分钟内完成。

授予SQL服务器有更多工作要做(组成新的ID等),但我是否以低效的方式获得ID?有没有一种更有效的方法来在两个表中执行插入操作?

+0

如果您可以更改查询以在批量中插入数据,那么插入到具有OUTPUT子句可以将所有插入的ID添加到(临时)表中,以便您可以在批次中的第二个表中插入ID。不知道这是否会有所帮助... – 2012-08-14 06:56:20

回答

1

您可能希望使用insert语句的output子句将标识值保存到变量或临时表中。

这样你也可以用更少的语句插入更大的批次。您可以使用表值参数发送数据。你可以看到的加速非常重要,就像一个数量级。绝对值得一看批量操作。

相关问题