私は、アプリケーションを見ているユーザにとって役に立たない部分的なデータを含むテーブルを持っています。視聴者は、すべての値が計算された同様のテーブルを見たいと思っており、THATデータをすばやく照会できるようにしたいと考えています。通常、これはビューを使用するのに最適な場所です。残念ながら、計算の複雑な性質は私のビューの使用を制限するので、別の解決策が必要です。私は次のようなことを考えていました...複雑なデータを表示する代わりに?
表Aにはバックエンドデータが含まれています。このテーブルが更新されるたびに、これらの計算の結果を示すテーブルBを更新するトリガが発生します。この時点で表Bを迅速に照会することができます。
私の唯一の懸念は、計算手順がやや長く、テーブルAがバーストで何度も更新される可能性があることです。 「Before Select」トリガーに近いソリューションはありますか?だから基本的にテーブルAは何度も何度も更新できますが、テーブルBがクエリされたときにだけ計算が行われますか?
ここでは例のタイムラインです:
- 表Aが
- 表Aは、データを表Bから要求される
- [誰もまだ表Bのデータを必要としないので、SPを実行しないでください]再び更新されて更新されます[実行SPを取得する前に表Bを更新するデータ]
- 表Aが更新される
- データ 01 [データを取得する前に、表Bを更新するために実行SP表Bから要求さデータは、だから私の質問はあり
[表A、表Bのデータの要求の間更新されなかったため、ストアドプロシージャを実行しないでください]表Bから要求されます。
- のように、既存のものはあります私が上で説明したものは?
- もしそうでなければ、更新/挿入のバッチが完了するまでトリガーを止めさせる方法がありますか?表Aは頻繁に変更されないため、更新されると遅いトリガーで暮らすことができます。唯一の問題は、表A がに更新されると、通常は一度に数百行になり、毎回遅いトリガーを実行したくないということです。
ありがとうございました!
編集 - なぜにもう少し詳しくは、(私は、少なくとも考える)トリガーの実装は遅いだろう:更新/挿入/削除文を送付します
- アプリケーションをLINQツーを使用していますSQLは、バッチ操作ではあまりよくありません。だから、たくさんのレコードを削除したいのであれば、バッチ削除ステートメントの代わりに一連のdeleteステートメントを送ります。削除文をグループ化し、その後にトリガを実行する方法はありますか? (たぶん私はここで話題から離れすぎている)。
- 私が言いたいのは、いくつかの再帰関数といくつかの意思決定プロセスです。私が実際に扱っているデータは、データのスケジューリングです。したがって、表Aにはスケジュールされた開始がある場合とない場合があるタスクが含まれています。スケジュールされた開始が定義されていない場合は、スケジュールされた開始時間+その先行時間の前のスケジュールからそれを派生させる必要があります。場合によっては、前任者にもその情報がない可能性があります。したがって、結果を見つけるまで掘り続ける再帰的クエリです。それは辛いほど遅くはないが、すべての挿入/更新/削除で実行する必要があった場合、そこに到達するだろう。上記の「テーブルB」は、基本的には同じテーブルですが、すでに計算されたスケジュールされた開始データがあります(テーブルAの更新時に変更する必要があります)。
@KM:私の編集を参照してください...マテリアライズドビューについてはわかりませんでしたが、古くなったデータを残しているようですが(私はデータをかなり最新にする必要があります) "仕事をする必要がある"というアイデアはかなり良いです。私の編集に基づいて他の洞察力を持っていますか? – Ocelot20
のビューが同期することは決してありません。[SQL Server 2005のインデックス付きビューによるパフォーマンスの向上](http://technet.microsoft.com/en-us/library/cc917715.aspx) –