2

現在、データベース内に保存されている大きなデータがあります。

このデータ セット (3000 レコード) は、ユーザーによって頻繁に取得されます。

現在、私が現在使用している方法は次のとおりです。

  1. データベースからこのレコードのセットを取得します
  2. データテーブルに変換
  3. キャッシュ オブジェクトに格納する
  4. クエリに基づくこのキャッシュ オブジェクトからの検索結果

    CachePostData.Select(string.Format("Name LIKE '%{0}%'", txtItemName.Text));
    
  5. 結果をリピーターにバインドします (ページごとに 40 レコードを表示するページングを使用)

しかし、パフォーマンスが良くないことに気付きました (リクエストごとに約 4 秒)。だから、これを行うためのより良い方法があるのだろうか?または、クエリごとにデータベースから結果をすぐに取得する必要がありますか?

4

3 に答える 3

2

データベースサーバーのヒットを減らすので、datatableを使用する方が効率的だと思います。データテーブルをキャッシュに保存してから再利用できます。このようなもの:-

public DataTable myDatatable()
{
   DataTable dt = HttpContext.Current.Cache["key"] as DataTable;
   if(dt == null)
   {
       dt = myDatatable();
       HttpContext.Current.Cache["key"] = dt;
   }
   return dt;
}

SqlCacheDependencyも確認してください

次のように、特定の時間間隔でキャッシュをクリアすることもできます。

HttpContext.Current.Cache.Insert("key", dt, null, DateTime.Now.AddHours(2), 
System.Web.Caching.Cache.NoSlidingExpiration);

DataTable キャッシュのパフォーマンスも確認してください

于 2013-10-26T13:29:56.123 に答える
2

データベースで実際に予想されるヒット数を知らずに、問題の正しい解決策を宣言するのは少し困難です。ほとんどの場合、フィルター処理のためにデータを ASP.NET キャッシュにキャッシュしません。これDataTable.Selectは、基本的に using による検索はテーブル スキャンを実行し、データベースのインデックス作成を利用できないためです。DataTable非常に大きな負荷がかからない限り、ほとんどのデータベース サーバーは、.NETでフィルター処理するよりも少ない遅延でこのタスクを実行できるはずです。

データベースが全文検索 (つまり、MSSQL または MySQL) をサポートしている場合は、name 列に全文インデックスを作成してクエリを実行できます。全文検索を使用すると、これらのタイプのLIKEクエリに対してさらに高速な応答タイプが得られるはずです。

一般に、アクセスを高速化するためにデータをキャッシュすることは良いことですが、この場合、DataTableデータの検索に関してはデータベース サーバーに劣る可能性が高くなります。キャッシュを使用して、フィルター処理されていないデータをより高速に、データベースにアクセスすることなく表示できます。

于 2013-10-26T16:24:41.820 に答える