我有一个应用程序,它针对以“星型模式”组织的数据量执行复杂查询。黄金拥有者不断添加新的“轴”来执行搜索,结果随着时间的推移性能变得更差。目前,执行搜索操作,使用存储过程在 SQL 服务器上完成所有工作,大约需要 2 秒,这不符合金主希望代码具有交互性的愿望(<0.1 秒响应时间) )。查看 SQL Server 查询分析器,搜索是 IO 绑定的,对 100,000 条记录的 9 次表扫描,然后进行残酷的连接。由于我需要执行的查询的性质和 SQL 的限制,这无法改进。
无奈之下,我重写了查询处理器,使其在应用程序启动时将 100,000 条记录吸入缓存,然后对缓存的内存执行复杂的查询。从数据库加载所有记录大约需要 12 秒。我重写的查询处理器减轻了这种昂贵的初始负载。它现在只需要对记录进行一次扫描,响应时间为 0.02 秒。
黄金拥有者发现填充缓存的 12 秒命中每一个小时左右都会发生一次,这使这个好消息受到污染。我目前将数据存储在 ASP.NET 应用程序状态中,如Application["FactTable"]
. 在 ASP.NET 应用程序空闲超过十分钟左右后,似乎正在重置应用程序状态。
如果我将 100,000 条记录移动到 ASP.NET 应用程序缓存中,我是否会经常遇到这些驱逐,或者我是否可以依靠内存中剩余的数据进行更长时间的快速检索?如果 ASP.NET 缓存也是应用程序重置的受害者,我应该使用什么其他机制?我想到了一个托管我的数据库缓存实例的单独应用程序域,但我不想走这条路,除非我的其他选项被关闭。