1

データベースで毎回クエリを実行し、「WHERE」演算子を使用するには?

SELECT * FROM tblProduct WHERE productID = @productID

また

キャッシュに入れられる製品リストをフィルタリングするには?

DataTable dtProducts = new DataTable();
dtProducts = HttpContext.Current.Cache["CachedProductList"] as DataTable;

DataView dvProduct = new DataView();
dvProduct = dtProducts.DefaultView;
dvProduct.RowFilter = String.Format("[productID] = {0}", iProductID);

ご意見をお聞かせください。前もって感謝します。

4

3 に答える 3

2

特にのようなインメモリメカニズムを介したデータのキャッシュHttpContext.Current.Cacheは、データベースに戻るよりも(ほとんど)常に高速になります。データベースに移動するにはネットワーク接続を確立する必要があり、データベースはI / Oなどを実行する必要がありますが、キャッシュを使用する場合はメモリ内のオブジェクトを使用するだけです。とはいえ、考慮しなければならないことがいくつかあります。

  • ASP.NETランタイムキャッシュは配布されません。このコードを複数のノードで実行する場合は、異なるノードが異なるバージョンのキャッシュデータを持っている可能性があるかどうかを判断する必要があります。
  • キャッシュは、必要な限り、わずか数分から永久にデータを保持するように指示できます。データをキャッシュする期間を決定するときは、データが変更されないままになる期間を考慮する必要があります。製品データはおそらく1日に1回以上変更されないため、キャッシュの非常に実行可能な候補です。
  • ただし、設定するキャッシュ時間制限は絶対的なものではないことに注意してください。メモリ制限のため、またはプロセス/アプリプールがリサイクルされるときに、オブジェクトをキャッシュから削除できます。
  • 上で指摘したように、DataTableキャッシュするのに適したオブジェクトではありません。シリアル化するのは非常にかさばり、費用がかかります。カスタムクラスのリストは、パフォーマンスの観点からはるかに優れた選択肢です。

一般的な経験則として、1時間に数回よりも頻繁にデータセットが必要で、数時間ごとよりも頻繁に変更されない場合は、データベースからリストを取得してキャッシュする方がよいでしょう。妥当な時間、そしてコードのフィルターによってそれを取得します。しかし、それは一般的なルールです。これは、特定の環境で実験する価値のある種類のものです。

200,000個のオブジェクトは、キャッシュに入れる大量のデータですが、頻繁に取得する必要がある場合は、データベースにとっても多くの作業になります。おそらく、キャッシュしたほうがよいサブセットと、必要になるたびに取得できる、使用頻度の低い別のサブセットがあります。私が言ったように、実験してください!

于 2012-09-21T17:19:17.383 に答える
2

パフォーマンスは、データとその使用方法に非常に主観的です。何が確実に機能するかを知る方法は、ベンチマークすることです。

データベースのパフォーマンスが必要なパフォーマンスを満たしていない場合にのみキャッシュすることを決定します。

データをキャッシュすると、データが最新であることを確認するために多くのオーバーヘッドが追加されます。

SQL サーバーは、クエリを実行するたびにディスクから読み取るのではなく、頻繁に実行されるクエリの結果をキャッシュします。キャッシュを決定する前に、データベースで使用されるキャッシュ メカニズムを理解しておいてください。ストアド プロシージャを使用すると、クエリ プランもキャッシュできます。

于 2012-09-21T03:34:14.487 に答える
0

私は最初の方法を好みます。キャッシュに20000行あるのは、私にはよく聞こえません。

于 2012-09-21T03:15:12.783 に答える