こんにちは、最近、ワークフローのある時点で 8 つの異なるモジュールが同じテーブルを使用しているアプリケーションの作業を開始しました。このテーブルには、5,000 行の長さの代わりのトリガーがあります (最初の 500 行と最後の 500 行はすべてのモジュールに共通で、各モジュールには独自の 500 行のコードがあります)。モジュールの数が増えていくので、できるだけ明確に (そして分離して) 維持したいので、トリガーをストアド プロシージャに分割するための何らかのベスト プラクティスがあるのではないかと考えていました。 ? PS トリガーからプロシージャを呼び出して 15 以上のパラメータを渡すと、パフォーマンスが低下することはありますか?
2 に答える
inserted
およびdeleted
疑似テーブルはトリガー コード内からのみアクセス可能であり、それらには複数の行を含めることができることに注意してください。次の 2 つの選択肢があります。
スカラー・パラメーターをストアード・プロシージャーに渡すことができるように、RBAR 1の方法で行を処理し
inserted
ます。または、deleted
inserted
テーブル変数との間ですべてのデータをコピーしdeleted
、必要に応じてプロシージャに渡します。
コピーだけで、どちらのアプローチでも2つのパフォーマンスオーバーヘッドが発生すると予想されます
そうは言っても、トリガー自体の内部で多くのことが行われているように思えます。このコードはすべて、DML ステートメントを実行した同じトランザクションの一部である必要がありますか? そうでない場合は、実行する作業に関する情報を配置する何らかの形式のキュー (要求のテーブルまたはサービス ブローカなど) を使用することを検討し、後でデータを処理します。サービス ブローカを使用する場合は、共有メッセージを作成し、必要に応じて、モジュールごとに専用のエンドポイントに適切なメッセージを送信します。
1 Row By Agonizing Row - cursor
1 つの行をシミュレートして各行に順番にアクセスする - 通常、SQL のようなセットベースの言語では眉をひそめます。
2コードの詳細に入り、考えられるすべてのアプローチを試して結果を測定しない限り、どの程度を知ることは不可能でしょうか。