【发布时间】:2015-11-24 16:17:51
【问题描述】:
我想为 sql server 2008 R2 Express Edition 实现一个简单的内存缓存。
要求:
- 缓存必须对所有用户可见
- 缓存与持久表同步。在此持久表上可能会发生繁重的 CRUD 操作。
我的解决方案: 创建一个存储在 .NET 程序集中的 CLR 过程桶。这些过程将被命名为:
- 添加 (param1, ... paramN);
- 删除(param1 ... paramN);
- GetAll();
其中 param1...paramN 是我要缓存的特定持久表数据。
在幕后,我可能会将内存中的数据组织到一个 HashSet 中,用于 O(1) 添加/删除。然后,我将为调用这些方法(添加/删除)的插入/删除操作(只有插入和删除可以在持久表上发生)创建一个触发器。最大的问题是事务可以回滚。如何发现特定 ID 的事务已回滚?有我可以监听的服务器级事件吗?
请给我你知道的任何替代方案。我知道 SQL Server 2014 支持内存优化的 OLTP 表,但是......此功能仅适用于 SQL Server 企业版:D。
另一种选择是使用##(在所有连接上可见)创建一个临时表,但是:
该表将存储在 TEMPDB 中。如果 tempDB 存储在 RAM 中,可能会提高性能,但接下来会出现第二个问题:
在这个临时表中搜索它(针对特定项目)将花费我 O ( Log ( N )),因为如果我在后台创建索引,就会有一个 B 树。我的内存替代方案将确保查找将花费 O (1)。
【问题讨论】:
-
您尝试使用此缓存解决的实际问题是什么?听起来很复杂,您能确定它甚至可以解决您的问题吗?
-
@JamesZ 的想法是我想执行 O (1) 查找,但 sql server 只能执行 O ( Log N),当我处理非常大的数字时,这对我的系统来说是不可接受的的记录。其次,如果我从内存中获取数据而不是从磁盘/持久表中读取数据,则会带来巨大的性能优势。无论如何,我的要求很复杂,但想法很简单:我最终会调用一个 CLR 函数,而不是一个连接,它可以在 O (1) 时间内获取我的数据。
标签: sql sql-server caching in-memory