我想为sql server 2008 R2 Express Edition实现一个简单的内存缓存。
要求:
我的解决方案: 创建一个嵌入.NET程序集的CLR过程。这些程序将命名为:
其中param1 ... paramN是我想要缓存的特定持久表数据。
在幕后我将在内存数据中组织成一个HashSet,用于O(1)添加/删除。然后,我将为调用这些方法(添加/删除)创建插入/删除操作(只能在持久表上进行插入和删除)的触发器。最大的问题是交易可以回滚。如何找出具有特定ID的事务已回滚?我可以听一个服务器级事件吗?
请告诉我你知道的任何其他选择。我知道SQL Server 2014支持内存优化的OLTP表,但是......此功能仅对SQL Server企业版有效:D。
另一种方法是使用##创建一个临时表(在所有连接上都可见)但是
该表将存储在TEMPDB中。如果tempDB存储在RAM中,可能会提高性能,但第二个问题就出现了:
在此临时表中搜索(对于特定项目)将花费我O(Log(N)),因为如果我在后台创建索引,则会有一个B树。 My In memory替代方案将确保查找成本为O(1)。
答案 0 :(得分:1)
如果你有足够的RAM,你真的没有从光盘读取数据,所有经常访问的数据都将在内存中。我不太详细了解快递版的限制,所以这些可能会引起你所面临的问题。我认为你至少应该考虑升级到标准版本,特别是如果你有大量的记录,因为你很可能也会用完空间。
Temp DB也不例外,它将在光盘或RAM中,具体取决于您拥有多少内存以及访问内容最多。只是为其他表中的数据创建缓存1:1到tempdb是没用的,你只会浪费你的内存来存储两次相同的数据。
SQL Server 2012的内存OLTP根本不会对您有所帮助。重点不是你在内存中有数据,而是为了减少锁定和开销的开销。锁定等。