我已经写了好几次内存中OLTP的文章和”为什么我还不推荐内存中OLTP给用户”。今天我想进一步谈下内存中OLTP背后的内存需求,还有如果你内存不够的话会发生什么。

一切都与内存有关!

我们都知道很久之前有个名人说过对于任何人,640K的内存应该足够了。他错了!对于内存中OLTP,内存需求非常高:

  • 哈希索引的每个哈希桶由64位长的指针组成
  • 每次你修改/删除一条记录,新版本的写入在内存中存储。

微软建议内存至少是你内存优化表的2倍。当你修改或删除记录时,这个两倍数量的空间是用做可能的行版本存储。

几个星期前,有人问我一个非常有趣的问题:当你没有足够的内存,在数据库启动期间内存中OLTP不能重建哈希索引会发生什么?这哥听起来像非常简单的问题,但在这个特定场景里知道内存中OLTP如何反应非常重要。

假设你在虚拟机里运行内存中OLTP,在某个时候你的虚拟机管理员给你的虚拟机比之前更少的内存。在虚拟化结合中,我经常看到这个。

让我们玩坏内存中OLTP!

我们来模拟这样的情景。在第一步,我想向你展示下,当你创建了内存优化表,你没有足够的可用物理内存,会发生什么。下列代码创建有4个哈希索引的新的内存优化表,每个哈希索引包含250百万的哈希桶。因此对这个整个表需要近7.4GB的内存,但我运行的虚拟机只有8G的内存。

-- 250 000 000 x 4 =  1 000 000 000 Hash Buckets of 8 bytes: 8 000 000 000 = 7.4 GB of memory overhead.
-- The following query will fail, because there is too less memory available.
CREATE TABLE Foo
(
Col1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 250000000),
Col2 INT NOT NULL INDEX idx_Col2 NONCLUSTERED HASH WITH (BUCKET_COUNT = 250000000),
Col3 INT NOT NULL INDEX idx_Col3 NONCLUSTERED HASH WITH (BUCKET_COUNT = 250000000),
Col4 INT NOT NULL INDEX idx_Col4 NONCLUSTERED HASH WITH (BUCKET_COUNT = 250000000)
)
WITH
(
MEMORY_OPTIMIZED = ON,
DURABILITY = SCHEMA_AND_DATA
)
GO

几秒后,CREATE TABLE语句失败,内存中OLTP给你一个漂亮的错误信息:你有太少的可用内存。

Msg 701, Level 17, State 137, Line 43 There is insufficient system memory in resource pool ‘default’ to run this query.

到目前还好。让我们重新设计表,只需要3.7G内存:

 -- 250 000 000 x 2 = 500 000 000 Hash Buckets of 8 bytes: 4 000 000 000 = 3.7 GB of memory overhead.
-- The following query will fail, because there is too less memory available.
CREATE TABLE Foo
(
Col1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 250000000),
Col2 INT NOT NULL INDEX idx_Col2 NONCLUSTERED HASH WITH (BUCKET_COUNT = 250000000)
)
WITH
(
MEMORY_OPTIMIZED = ON,
DURABILITY = SCHEMA_AND_DATA
)
GO

这次表创建成功,因为我有足够的可用内存。现在我使坏,关掉虚拟机。我配置它只有3G的内存:

现在当我们重启虚拟机和SQL Server,你认为会发什么?你觉得SQL Server可以把我们数据库恢复在线么?或者你认为只有主文件组(PRIMARY file group)恢复在线,内存中文件组(In-Memory file group)还是离线?我们来试下!

重启后,当你在SSMS里查看对象浏览器,你可以看到我们“整个”数据库在恢复待定状态(Recovery Pending)!

这真的真的太糟糕了,因为你不能访问你的任何数据库!即使基于传统硬盘的表也不能访问!当你查看SQL Server日志,你也会看到SQL Server给你有太少可用内存的错误信息:

偶滴神哪,我们已经玩坏内存中OLTP……

小结

我知道模拟的情况非常少见,但我说过,当虚拟机管理员只从虚拟机里拿走内存时,这个情况很常见。与内存中OPTP结合,这就意味着你的整个数据库不可访问!

当你在基于内存中OLTP部署数据库时,请记住这个。你要认真考虑你的内存需求,你也要按需调整你的未来可用内存。

感谢关注!

原文链接:

http://www.sqlpassion.at/archive/2016/05/31/in-memory-oltp-and-too-less-memory/

内存中OLTP与内存不足的更多相关文章

  1. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(三)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...

  2. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(二)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...

  3. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(一)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...

  4. SQL Server 内存中OLTP内部机制概述(四)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  5. SQL Server 内存中OLTP内部机制概述(二)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  6. SQL Server 内存中OLTP内部机制概述(一)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  7. 配置内存中OLTP文件组提高性能

    在今天的文章里,我想谈下使用内存中OLTP的内存优化文件组来获得持久性,还有如何配置它来获得高性能.在进入正题前,我想简单介绍下使用你数据库里这个特定文件组,内存OLTP是如何获得持久性的. 内存中O ...

  8. 为什么我还不推荐内存中OLTP给用户

    嗯,有些人在看玩这篇文章后会恨我,但我还是要说.1个月来我在内存中OLTP这个里领域里做了大量的工作,很多用户都请求使用这个惊艳的新技术.遗憾的是,关于内存中OLTP没有一个是真的令人激动的——看完你 ...

  9. SQL Server 内存中OLTP内部机制概述(三)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

随机推荐

  1. Filter 数组过滤函数精解示例

    '************************************************************************* '**模 块 名:Filter 数组过滤函数精解示 ...

  2. 线上应用bug跟踪查找-友盟统计

    线上的应用只要用心点点都能发现些bug,连微信,QQ也不列外.但是bug中最严重的算是闪退了,这导致了用户直接不能使用我们的app. 我们公司是特别注重用户反馈和体验的,我们会定期打电话咨询用户的使用 ...

  3. Linux下的.NET之旅:第一站,CentOS+Mono+Xsp构建最简单的ASP.NET服务器

    一.Mono产生的背景 由于Linux/Unix等有更强的安全性.运行效率高.拥有大量优秀的开源组件,而.Net则有着其他语言无与伦比的开发效率,因此在非微软平台下运行.Net程序的需求很强烈.Mon ...

  4. java中文乱码解决之道(七)-----JSP页面编码过程

    我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...

  5. String驻留带来的危害

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com   前段时间接手了一个项目优化工作,在同等场景下内存使用从4G降低到200M.   项目是将实体序列化成字符串存入 ...

  6. 让Chrome 接管邮件连接,收发邮件更方便了

    页面中除了传统的超链接外,还可以将邮箱地址写入<a>标签,意思不表自明,当然是用户点击后就会打开相应的邮件客户端向这个连接指向的邮件地址发邮件. <a href="mail ...

  7. Modern OpenGL用Shader拾取VBO内单一图元的思路和实现

    Modern OpenGL用Shader拾取VBO内单一图元的思路和实现 什么意思? 拾取 最简单的理解拾取的方式大概是到(http://www.yakergong.net/nehe/course/t ...

  8. 《3D Math Primer for Graphics and Game Development》读书笔记1

    <3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...

  9. 【VC++技术杂谈008】使用zlib解压zip压缩文件

    最近因为项目的需要,要对zip压缩文件进行批量解压.在网上查阅了相关的资料后,最终使用zlib开源库实现了该功能.本文将对zlib开源库进行简单介绍,并给出一个使用zlib开源库对zip压缩文件进行解 ...

  10. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...