データ (「イベント」) を処理し、レポート目的で結果をテーブルに挿入しています。データは一括で挿入されるため、ストアド プロシージャを使用しています。
さまざまなイベント タイプには共通のフィールドと固有のフィールドがあるため、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 を取得していますか? 両方のテーブルへの挿入を実行するより効率的な方法はありますか?