2

これが私のシナリオです:

テーブルから特定の行セット (約 30,000 行) を削除し、ほぼ同じ量の行を挿入する単純なストアド プロシージャがあります。通常、これには数秒しかかかりません。ただし、テーブルには挿入/削除を監視するトリガーがあり、別のサーバーのリンクされたテーブルに何が起こったかを模倣しようとします。

このプロセスは、トリガーのために非常に遅く、このプロセス中にテーブルもロックされます。だからここに私の2つの質問があります:

  1. スローダウンのかなりの部分は、トランザクション ログによるものだと思います。ストアド プロシージャで、プロシージャの内容をログに記録しないように指定する方法はありますか?
  2. プロセス全体でテーブルをロックせずに「DELETE FROM」および「INSERT INTO」コマンドを実行する方法はありますか?

ありがとう!

編集- 回答ありがとうございます。私はそれが事実であると考えました(上記のいずれも実行できません)が、確認したかったのです。トリガーはかなり前に作成されたもので、あまり効率的ではないように見えます。そのため、次のステップはそれを調べて、何が必要で、どのように改善できるかを見つけることです. ありがとう!

4

5 に答える 5

2

1) いいえ、また、TRUNCATE や BULK INSERT などの最小限のログ記録操作を行っていません。

2) いいえ、そうでなければどのように汚職を防ぎますか?

于 2009-01-14T18:26:46.607 に答える
1

トリガーには役立ちませんが、ロックの問題の解決策は、トランザクションを小さなバッチで実行することです。

それ以外の

DELETE FROM Table WHERE <Condition>

次のようなことをします

WHILE EXISTS ( SELECT * FROM table WHERE <condition to delete>)
BEGIN
  SET ROWCOUNT 1000
  DELETE FROM Table WHERE <Condition>
  SET ROWCOUNT 0
END
于 2009-01-14T18:36:15.073 に答える
1

パフォーマンスの問題がロギングによるものであると自動的に想定することはできません。実際、パフォーマンスの問題を引き起こすような方法でトリガーが記述されている可能性があります。元の質問を変更して、トリガーのコードを表示することをお勧めします。

于 2009-01-14T18:27:13.983 に答える
1

データを変更するときに、トランザクションの整合性を無効にすることはできません。select * from table (nolock)を使用してデータを選択すると、ロックを無視できます。ただし、細心の注意を払い、アプリケーションがダーティ リードを処理できるようにする必要があります。

于 2009-01-14T18:28:04.670 に答える
1

トリガーを一時的に無効にし、proc を実行してから、トリガーが行っていたことをより効率的な方法で行うことができます。

-- disable trigger
ALTER TABLE [Table] DISABLE TRIGGER [Trigger]
GO

-- execute your proc
EXEC spProc
GO

-- do more stuff to clean up / sync with other server
GO

-- enable trigger
ALTER TABLE [Table] ENABLE TRIGGER [Trigger]
GO
于 2009-01-14T18:41:51.600 に答える