【问题标题】:SQL Server in memory cache内存缓存中的 SQL Server
【发布时间】:2015-11-24 16:17:51
【问题描述】:

我想为 sql server 2008 R2 Express Edition 实现一个简单的内存缓存。

要求:

  1. 缓存必须对所有用户可见
  2. 缓存与持久表同步。在此持久表上可能会发生繁重的 CRUD 操作。

我的解决方案: 创建一个存储在 .NET 程序集中的 CLR 过程桶。这些过程将被命名为:

  • 添加 (param1, ... paramN);
  • 删除(param1 ... paramN);
  • GetAll();

其中 param1...paramN 是我要缓存的特定持久表数据。

在幕后,我可能会将内存中的数据组织到一个 HashSet 中,用于 O(1) 添加/删除。然后,我将为调用这些方法(添加/删除)的插入/删除操作(只有插入和删除可以在持久表上发生)创建一个触发器。最大的问题是事务可以回滚。如何发现特定 ID 的事务已回滚?有我可以监听的服务器级事件吗?

请给我你知道的任何替代方案。我知道 SQL Server 2014 支持内存优化的 OLTP 表,但是......此功能仅适用于 SQL Server 企业版:D。

另一种选择是使用##(在所有连接上可见)创建一个临时表,但是:

  1. 该表将存储在 TEMPDB 中。如果 tempDB 存储在 RAM 中,可能会提高性能,但接下来会出现第二个问题:

  2. 在这个临时表中搜索它(针对特定项目)将花费我 O ( Log ( N )),因为如果我在后台创建索引,就会有一个 B 树。我的内存替代方案将确保查找将花费 O (1)。

【问题讨论】:

  • 您尝试使用此缓存解决的实际问题是什么?听起来很复杂,您能确定它甚至可以解决您的问题吗?
  • @JamesZ 的想法是我想执行 O (1) 查找,但 sql server 只能执行 O ( Log N),当我处理非常大的数字时,这对我的系统来说是不可接受的的记录。其次,如果我从内存中获取数据而不是从磁盘/持久表中读取数据,则会带来巨大的性能优势。无论如何,我的要求很复杂,但想法很简单:我最终会调用一个 CLR 函数,而不是一个连接,它可以在 O (1) 时间内获取我的数据。

标签: sql sql-server caching in-memory


【解决方案1】:

如果您有足够的 RAM,您实际上并没有从磁盘读取数据,您经常访问的所有数据都将在内存中。我真的不详细了解快速版的限制,所以这些可能会导致您面临的问题。我认为您至少应该考虑升级到标准版本,特别是如果您的记录数量很大,因为您很可能也会用完空间。

Temp DB 也不例外,它将位于磁盘或 RAM 中,具体取决于您拥有多少内存以及访问最多的内容。只是将其他表中的数据以 1:1 的比例创建缓存到 tempdb 中是没有用的,您只会浪费内存来存储相同的数据两次。

SQL Server 2012 的内存中 OLTP 可能根本无法帮助您。重点不是你有内存中的数据,而是减少锁定和闩锁等的开销。

【讨论】:

  • 你错过了我的意思:我希望搜索时间在 O (1) 时间内!!!!。 SQL Server 没有为我提供这样的性能。还是这样? (也许我可以声明一个索引的行为就像一个哈希表,但我没有看到这个选项存在)
  • 为什么要使用 SQL Server?听起来您偏向于基于内存的技术,那么为什么不从 Gemfire 或 VoltDB 开始,而不是围绕您将要绕过的技术构建一些东西呢?
  • 您的问题并没有说明 O(1) 是必需的。如果你真的打算通过 CLR 运行选择,我认为你甚至不会接近那个。如果您需要,那么您可能应该开始研究与 SQL Server 不同的平台,就像 @BradD 已经说过的那样。
  • 我的数据库是 99.99999 % 用户,通过使用经典 sql 从表中进行选择。这是一个非常具体的问题,与动态列的排序有关
  • @JameZ 请停止使用另一个数据库引擎,我无法将这个遗留系统迁移到全新的范例/架构中
猜你喜欢
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2016-03-09
  • 2011-03-06
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多