【发布时间】:2010-10-31 21:06:25
【问题描述】:
这是我的情况:
- 用户 A 必须监控 sql 查询 Q 的结果。
- 用户B可以修改可能改变Q结果的数据
- 在整个数据库上运行 Q 很慢
我想要的是:每当用户 B 修改数据时: 使用创建、更新或删除,然后生成 Q 结果的增量。 即返回(修改列表、创建列表、删除列表)三元组。
因此,对 Q 的更新会快得多。
实现细节:SQL Server 2005,带有 NHibernate 层。目前,用户 A 以轮询模式运行 Q,每 10 秒一次。
我的一个想法是创建数据库模式的内存副本,当用户 B 进行更改,然后也在内存副本中进行此更改,然后运行 Q 在这个内存中的副本上。
有更好的方法吗?
后记:感谢所有详细的 cmets。我决定按如下方式实现此功能:
- 使用 NHibernate PostUpdate 事件在数据库发生更改时获取通知
- 对内存中的更新集合运行 LINQ to Object 查询
- 对于系统中注册的每个 SQL 查询,将结果列表存储在 Redis 服务器上的内存中(不持久化到磁盘)
- 如果 LINQ 查询表明更新与给定查询相关,即更改结果集,则更新 Redis 上的列表
- 使用某种类型的通知(例如 Redis Pub/Sub)来通知用户给定查询的更改
- 在 Redis 上更新列表时,传入 sql server 更新时间戳。 Redis 端需要一些代码来解决基于时间戳的冲突。如果以较低的时间戳传入更改,则忽略。
【问题讨论】:
-
你希望用这个做什么?
-
@OMG Ponies:我需要在我的数据库前面有一个快速缓存,以加快查询速度。另外,想让它增量,这样我就不必对整个数据库重复查询。
标签: sql performance sql-server-2005 nhibernate