C# 从datatable(缓存对象)到数据库的搜索项

C# 从datatable(缓存对象)到数据库的搜索项,c#,asp.net,C#,Asp.net,目前我有一个大的数据,存储在数据库中 这组数据(3000条记录)将由用户频繁检索 目前我正在使用的方法是: 从数据库中检索这组记录 转换为数据表 存储到缓存对象中 基于查询的此缓存对象的搜索结果 CachePostData.Select(string.Format("Name LIKE '%{0}%'", txtItemName.Text)); 将结果绑定到中继器(分页每页显示40条记录) 但是我注意到性能不好(每个请求大约4秒)。所以,我想知道有没有更好的方法?或者我应该立即从数据库中检索

目前我有一个大的数据,存储在数据库中

这组数据(3000条记录)将由用户频繁检索

目前我正在使用的方法是:

  • 从数据库中检索这组记录
  • 转换为数据表
  • 存储到缓存对象中
  • 基于查询的此缓存对象的搜索结果

    CachePostData.Select(string.Format("Name LIKE '%{0}%'", txtItemName.Text));
    
  • 将结果绑定到中继器(分页每页显示40条记录)


  • 但是我注意到性能不好(每个请求大约4秒)。所以,我想知道有没有更好的方法?或者我应该立即从数据库中检索每个查询的结果?

    我认为使用datatable会更有效,因为这样可以减少对数据库服务器的点击。您可以将数据表存储在缓存中,然后重新使用它。大概是这样的:-

    public DataTable myDatatable()
    {
       DataTable dt = HttpContext.Current.Cache["key"] as DataTable;
       if(dt == null)
       {
           dt = myDatatable();
           HttpContext.Current.Cache["key"] = dt;
       }
       return dt;
    }
    
    HttpContext.Current.Cache.Insert("key", dt, null, DateTime.Now.AddHours(2), 
    System.Web.Caching.Cache.NoSlidingExpiration);
    
    也检查

    您还可以在某些特定时间间隔清除缓存,如下所示:-

    public DataTable myDatatable()
    {
       DataTable dt = HttpContext.Current.Cache["key"] as DataTable;
       if(dt == null)
       {
           dt = myDatatable();
           HttpContext.Current.Cache["key"] = dt;
       }
       return dt;
    }
    
    HttpContext.Current.Cache.Insert("key", dt, null, DateTime.Now.AddHours(2), 
    System.Web.Caching.Cache.NoSlidingExpiration);
    

    另请检查

    如果不知道您实际希望在数据库上点击多少次,就很难为您的问题声明正确的解决方案。在大多数情况下,我不会将数据缓存在ASP.NET缓存中进行筛选,因为使用
    DataTable.Select进行搜索基本上是执行表扫描,无法利用数据库索引。除非您遇到非常重的负载,否则大多数数据库服务器应该能够以比在.NET中过滤
    DataTable
    更少的延迟执行此任务

    如果您的数据库支持全文搜索(即MSSQL或MySQL),则可以在“名称”列上创建全文索引并进行查询。全文搜索应该为这些类型的
    查询提供更快的响应类型,如
    查询


    通常,缓存数据以便更快地访问是好的,但在这种情况下,
    DataTable
    在搜索数据方面很可能不如数据库服务器。您仍然可以使用缓存更快地显示未经筛选的数据,而无需点击数据库。

    DataTable。选择
    可能不是搜索内存缓存的最有效方法,但搜索3000行肯定不会花费4秒或类似的时间

    第一步是找出性能瓶颈所在。我打赌这与搜索缓存无关,但您可以很容易地找到,例如,使用以下代码:

    var stopwatch = Stopwatch.StartNew();
    var result = CachePostData.Select(string.Format("Name LIKE '%{0}%'", txtItemName.Text));
    
    WriteToLog("Read from cache took {0} ms", stopwatch.Elapsed.TotalMilliseconds);
    
    其中
    WriteToLog
    跟踪某处(例如System.Diagnostics.Trace、System.Diagnostics.Debug或log4net等日志框架)

    如果您正在寻找缓存的替代方案,只需缓存实体对象的通用列表,并使用Linq搜索该列表:

    var result = CachePostData.Select(x => x.Name.Contains(txtItemName.Text));
    

    这可能稍微有效一些(例如,它不需要解析“NAME LIKE…”过滤器表达式),但我也不认为这是您的瓶颈。

    我现在正在使用此方法。如果显示没有任何搜索查询,速度非常快。但在搜索datatable中的某些记录时,似乎需要一些时间来完成请求。您获得或期望每秒多少个请求?“使用datatable进行搜索。Select基本上执行表扫描,无法利用数据库索引”-但对于有问题的筛选器-就像以通配符开头一样-数据库也会执行表扫描。@Joe有人可能会说这是一个实现细节,但是的。:)但根据经验,我确实认为在这种情况下这不应该是一个问题。另外,让服务器执行查询将使转换到全文搜索更容易一些。好的。谢谢你的意见,我也想知道。不过,问题一定与查询有一定的关联,因为他们声称,如果不使用类似的查询进行选择,直接显示数据时,它的工作速度会快得多。”…因为他们声称,如果他们…,它的工作速度会快得多-如果不进行验证,请不要相信这些说法。首先重现性能问题,然后调查。是。你是对的。延迟问题来自其他方面。谢谢