C# 从datatable(缓存对象)到数据库的搜索项
目前我有一个大的数据,存储在数据库中 这组数据(3000条记录)将由用户频繁检索 目前我正在使用的方法是:C# 从datatable(缓存对象)到数据库的搜索项,c#,asp.net,C#,Asp.net,目前我有一个大的数据,存储在数据库中 这组数据(3000条记录)将由用户频繁检索 目前我正在使用的方法是: 从数据库中检索这组记录 转换为数据表 存储到缓存对象中 基于查询的此缓存对象的搜索结果 CachePostData.Select(string.Format("Name LIKE '%{0}%'", txtItemName.Text)); 将结果绑定到中继器(分页每页显示40条记录) 但是我注意到性能不好(每个请求大约4秒)。所以,我想知道有没有更好的方法?或者我应该立即从数据库中检索
CachePostData.Select(string.Format("Name LIKE '%{0}%'", txtItemName.Text));
但是我注意到性能不好(每个请求大约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有人可能会说这是一个实现细节,但是的。:)但根据经验,我确实认为在这种情况下这不应该是一个问题。另外,让服务器执行查询将使转换到全文搜索更容易一些。好的。谢谢你的意见,我也想知道。不过,问题一定与查询有一定的关联,因为他们声称,如果不使用类似的查询进行选择,直接显示数据时,它的工作速度会快得多。”…因为他们声称,如果他们…,它的工作速度会快得多-如果不进行验证,请不要相信这些说法。首先重现性能问题,然后调查。是。你是对的。延迟问题来自其他方面。谢谢