ASP.Net-C#-SQL Server-仅使用已更改的记录刷新缓存的数据表

ASP.Net-C#-SQL Server-仅使用已更改的记录刷新缓存的数据表,c#,asp.net,sql-server,caching,datatable,C#,Asp.net,Sql Server,Caching,Datatable,我的web应用程序中缓存了一个大型数据表,它是返回大型数据集的复杂查询的结果。虽然缓存了此数据表,但运行以“刷新”此缓存的查询仍然需要很长时间,这主要是由于返回的数据量太大 为了加快速度,我正在考虑对我的表实现一种时间戳类型的方法,以便将查询限制为只返回已更改的行 然后,我打算将这个较小的数据集与缓存的数据表合并 有没有人做过类似的事情,或者已经有人处理过了 我觉得如果我直接投入进去的话,这可能是一种重新发明轮子的情况。就我个人而言,我以前使用过时间戳方法,而且效果很好——它只检索自上次读取以来

我的web应用程序中缓存了一个大型数据表,它是返回大型数据集的复杂查询的结果。虽然缓存了此数据表,但运行以“刷新”此缓存的查询仍然需要很长时间,这主要是由于返回的数据量太大

为了加快速度,我正在考虑对我的表实现一种时间戳类型的方法,以便将查询限制为只返回已更改的行

然后,我打算将这个较小的数据集与缓存的数据表合并

有没有人做过类似的事情,或者已经有人处理过了


我觉得如果我直接投入进去的话,这可能是一种重新发明轮子的情况。

就我个人而言,我以前使用过时间戳方法,而且效果很好——它只检索自上次读取以来更改的数据,从而使缓存更加有效

或者,我建议使用一个类来为您保持缓存的最新状态。我无法评论这种方法的任何实际利弊,或者性能比较与时间戳方法的优劣,因为我自己没有使用过它

还有一篇关于SqlCacheDependency的有用文章

更新: 是的,我认为它实际上不会刷新数据。听起来你得自己做。 从第二个链接:

当数据更改时,只有 然后缓存基于此的项目 数据将失效并从中删除 缓存。下次你要求的时候 缓存中的该项(如果不是) 在缓存中,可以重新添加 将更新的版本添加到缓存中,并将其删除 确保您拥有最新的数据

第二个链接中还有SQL 2005特定的实施说明:

SQLServer2005监视对的更改 特定SQL的结果集 指挥部。如果系统发生变化 将修改结果的数据库 那个命令的集合,依赖项 导致缓存的项被删除 无效。这允许使用SQL Server 2005年提供世界其他地区级别 通知

我个人认为我应该采用时间戳方法(这是我以前做过的),因为从表面上看,SqlCacheDependency不会给性能带来任何好处——我认为它的性能会更低(只是更容易实现)。总有一天,我会抽出时间实际试用SqlCacheDependency,以进行适当的性能分析:)

更新2: 关于将新数据合并到现有datatable中,我认为datatable的方法就是您想要的

Merge方法用于合并两个基本上具有相似模式的DataTable对象。合并通常用于客户端应用程序,以将数据源中的最新更改合并到现有数据表中


将新的源DataTable合并到目标中时,DataRowState值为Unchanged、Modified或Deleted的任何源行都将与主键值相同的目标行相匹配。DataRowState值为Added的源行与主键值与新源行相同的新目标行相匹配


您只需确保在datatable上定义了作为主键的列。

我认为SqlCacheDependency只是一种指示数据过时的方法。我在这里看到的关键是只返回过期的记录,而不是检索整个数据表。你知道它是否能够做到这一点吗?是的,我相信你是对的(我的答案中更新了注释)。如果它只刷新更改的数据就好了,但我认为它不会这样做——如果可以,我不确定在不重新执行完整的原始查询的情况下如何处理新数据。因此,我认为时间戳方法是最好的。谢谢更新。正如我所想。我所追求的关键是更多关于如何用更改的记录更新缓存数据表的想法。我想可能有一个内置的“合并”功能。你是说在查询更新记录后,如何将包含更新记录的第二个数据表合并到原始缓存数据表中?或者你的意思是不必自己按时间戳查询的想法?将缓存的数据表与新查询的更改行合并的方法。我对使用时间戳并没有问题,问题更多的是如何以最小的麻烦将更改获取到缓存的数据表中。