私は興味深いデリムマを持っています。私はいくつかの完全なテーブルスキャンと高価な結合を行うだけでなく、いくつかの地理空間データを計算するスカラーUDFを呼び出すことを含む非常に高価なクエリを持っています。SQLServerでキャッシュテーブルを使用すると、私は狂っていますか?
最終結果は、ユーザーに提示されるデータを含む結果セットです。しかし、元の結果セットをページに分割して指定されたページだけを返すので、ユーザーに1回の呼び出しで表示したいすべてを返すことはできません。また、元のデータセット全体を取得し、グループ化および結合を適用する必要もあります関連する集計データを計算します。
要するに、UIに必要なすべてのデータをバインドするには、この高価なクエリを約5-6回呼び出す必要があります。
私は、この高価なクエリを1回計算する方法について考え始めました。その後、それぞれの呼び出しが何らかの理由でキャッシュされた結果セットを取得する可能性がありました。
私は、CacheID(Guid)をnull可能なパラメータとして取り込むストアドプロシージャにクエリを抽象化するという考えにぶつかりました。
このsprocは、この特定の結果セットを一意に識別するためにcacheIDを使用して結果セットをキャッシュテーブルに挿入します。
これは、この結果セットで動作する必要のあるsprocsが以前のクエリのcacheIDを渡すことを可能にし、データを取得する単純なSELECT文です(cacheIDに1つのWHERE句を使用)。
次に、定期的なSQLジョブを使用して、キャッシュテーブルをフラッシュします。
これはうまく動作し、ロードテストがゼロになると速度が上がります。しかし、私は、このテクニックが大量の読み込みとキャッシュテーブルに対する書き込みに伴う負荷の下で問題を引き起こす可能性があることを心配しています。
私は夢中ですか?それとも良いアイデアですか?
明らかに、私はロックの競合とインデックスの断片化について心配する必要がありますが、何か他のことについて心配する必要がありますか?
その後、何千もの結果をアプリに戻す必要がありますか? – FlySwat
詳しくは、このデータで多くのSQL操作を実行し、結果をアプリに送信するだけです。したがって、アプリのキャッシュは非生産的なものになります。 – FlySwat
@FlySwat私は、これについて仲介者を導入することは検討する価値があると考えています。長時間実行しているレポートを実行するたびにDBを適切に送信したくない場合、サービスを途中で実行するとスロットルとDBの負荷を減らす –