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

ID 値を変数または一時テーブルに保存するには、insert ステートメントの output 句を使用することをお勧めします。

そうすれば、より少ないステートメントでより大きなバッチを挿入することもできます。テーブル値パラメーターを使用してデータを送信できます。ご覧のとおり、桁違いの高速化が非常に顕著です。一括操作については一見の価値があります。

于 2012-08-14T09:30:33.470 に答える