0

我正在处理数据(“事件”)并将结果插入表格以进行报告。数据是批量插入的,所以我使用的是存储过程。

各种事件类型具有公共和特定字段,因此 INSERT 语句如下所示:

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

Event 和 FileEvent 之间是 1:1 的关系。

EventID 过去由原始数据提供。最近,我不得不将 EventID 列修改为 IDENTITY 列(原始数据中的 EventID 重复,因此不能再将其用作输入)。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?有没有更有效的方法来插入两个表?

4

1 回答 1

1

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

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

于 2012-08-14T09:30:33.470 回答