2011-10-20 5 views
0

私は、システムで最も使用されている検索クエリを最適化しようとしています。これまで私はいくつかの欠落しているインデックスを追加しており、それは少し助けになっています。しかし、私はさらにDBサーバーの負荷を軽減したい。私が使用する1つのオプションは、asp.netキャッシュにLISTとして結果セットをキャッシュするので、頻繁にdbにヒットする必要はありません。選択クエリの結果セットをデータベースにキャッシュすることは可能ですか?

しかし、私は、データベースにも選択クエリの一部をキャッシュする方法があるのだろうかと思っていました。例えば検索結果では、過去180日間にアクティブで、共有情報がtrueに設定されているユーザーのみが対象となります。これは毎回dbが処理し、指定されたカテゴリ、都市などの他の条件が適用されるスーパーセットのようなものです。何とかスーパーセットをキャッシュして、テーブル全体に対してクエリを実行するのではなく、スーパーセットに対してクエリを実行できるようにすることは可能ですか?これでビューのヘルプを作成しますか?私は管理ビューを読んでオーバーヘッドになり、テーブルを修正する柔軟性を失うので、ビューを作成するのはちょっと躊躇しています。

私はSql-Server 2005を使用しているため、テーブルにフィルタリングされたインデックスを作成できません。これは役に立つと思われます。

+0

遅い検索クエリを投稿できますか? –

答えて

1

私は@Neville Kに同意します。SQL Serverは、メモリ内のデータをキャッシュするのはかなりスマートです。あなたの努力のためのパフォーマンスの向上は限られているかもしれません。

サブクエリのインデックス付きビュー(Enterprise Editionのみ)http://technet.microsoft.com/en-us/library/cc917715.aspxを使用できます。

+0

私はIndexed Viewを試しています。ただし、私のサーバーはEnterprise Editionではありません。今日のどこかでは、エンタープライズエディションでない場合でも、インデックス付きビューを使用できますが、キーワードを使用して明示的に状態を記述する必要があることをお読みください。キーワードが何であるかを見つけることができません。 – shashi

+0

[OK]をクリックすると、クエリで強制的にビューが使用されます。キーワードは、共有した記事に記載されているNOEXPANDです。残念ながら、それはパフォーマンスの向上につながりません。 – shashi

+0

あなたは、利益が限られているか全くないということは間違いありません。私は今、アプリケーション層のオブジェクトをキャッシュし、頻繁にデータベースにヒットしないようにしています。 – shashi

0

これはもちろん可能ですが、それが役立つかどうかはわかりません。

スケジュールされたジョブを作成すると、「active_users_with_share_info」という名前のテーブルを切り捨てて選択したクエリに基づいて、過去180日間にアクティブだったユーザーを「share_info =真 "である。

次に、このテーブルに検索クエリを参加させることができます。

しかし、私はこれがうまくいくとは思っていません - SQL Serverはキャッシングでかなりスマートです。膨大な量のデータ(100万レコード)やハードウェアが非常に限られていない限り、測定可能なパフォーマンスの向上は期待できますが、是非試してみてください!

もちろん、あなたのアプリケーションではより多くの部品が動くようになり、より一層面白いエラーモード(夜間バッチが黙って失敗するとどうなるでしょうか?)と、チームに参加する新規デベロッパーのトレーニングが増えます。

関連する問題