我正在处理数据('事件')并将结果插入表中以用于报告目的。 数据是批量插入的,所以我使用的是存储过程。
各种事件类型都有公共和特定字段,因此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?是否有更有效的方法在两个表中执行插入?
答案 0 :(得分:1)
您可能希望使用insert语句的output子句将标识值保存到变量或临时表。
这样你也可以在更少的语句中插入更大的批次。您可以使用表值参数发送数据。您可以看到的加速非常重要,就像一个数量级。绝对值得寻找批量操作。