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 运行时缓存不是分布式的。如果您将在多个节点上运行此代码,您必须确定是否可以接受可能具有不同版本缓存数据的不同节点。
  • 可以告诉缓存保存数据,只要您想要它们,短至几分钟,长至永远。在决定缓存多长时间时,您必须考虑数据将保持多长时间不变。产品数据的变化可能不会超过一天一次,因此它是一个非常可行的缓存候选者。
  • 请注意,您设置的缓存时间限制不是绝对的;由于内存限制或进程/应用程序池回收时,可以从缓存中逐出对象。
  • 正如上面所指出的,DataTable缓存不是一个好的对象;序列化非常庞大且昂贵。从性能的角度来看,自定义类列表是更好的选择。

我会说作为一般经验法则,如果您需要一组数据的频率高于每小时几次,并且它的更改频率低于每隔几个小时,那么最好从数据库中提取列表,将其缓存起来以备不时之需合理的时间,并通过代码中的过滤器检索它。但这是一般规则;这是值得在您的特定环境中尝试的东西。

200,000 个对象是要放入缓存中的大量数据,但如果您必须经常检索它,数据库的工作量也很大。也许它的某些子集会更好地缓存,而另一个不常用的子集可以在每次需要时检索。正如我所说,实验!

于 2012-09-21T17:19:17.383 回答
2

性能对您的数据及其使用方式非常主观。确定什么有效的方法是进行基准测试。

仅当您的数据库性能不符合您需要的性能时才决定缓存。

当您缓存数据时,会增加很多开销来确保它是最新的。

每次触发查询时,Sql server 不会从磁盘读取,它会缓存频繁查询的结果。在决定缓存之前,请了解数据库使用的缓存机制。使用存储过程也可以让您缓存查询计划

于 2012-09-21T03:34:14.487 回答
0

我更喜欢第一种方法。在缓存中有 20000 行对我来说听起来并不好。

于 2012-09-21T03:15:12.783 回答