0

トリガーにこのコードがあります。

if isnull(@d_email,'') <> isnull(@i_email,'')
 begin
 update server2.database2.dbo.Table2
 set
 email = @i_email,
 where user_id = (select user_id from server2.database2.dbo.Table1 where login =  @login)
 end

別の db サーバーでテーブルを更新したいのですが、どちらも MSSQL です。上記のクエリは機能しますが、完了するまでに 10 秒以上かかります。table2 には 200k を超えるレコードがあります。実行計画を実行すると、リモート スキャンのコストが 99% と表示されます。

どんな助けでも大歓迎です。

4

2 に答える 2

0

おっと、トリガーが悪い!1 つのレコードのみが挿入/更新または削除されると想定してトリガーを作成しないでください。トリガーでこのように変数を使用すべきではありません。トリガーはデータのバッチで動作します。1 つのレコードを想定すると、データベースの整合性の問題が発生します。

値に変数を使用するのではなく、挿入されたテーブルに結合する必要があります。

また、実際にリモート サーバーに更新することは、トリガーとしてはあまり適切ではないかもしれません。リモート サーバーがダウンすると、元のテーブルに何も挿入できなくなります。データがリアルタイムよりも多少遅くなる可能性がある場合、通常の手法は、トリガーを同じサーバー上のテーブルに移動させ、ジョブが 5 ~ 10 分ごとに新しい情報を取得することです。そうすれば、リモート サーバーがダウンしても、レコードを挿入することができ、ジョブがレコードを取得してリモート サーバーに送信できるようになるまで保存されます。

于 2009-10-16T18:33:13.347 に答える