内存中OLTP与内存不足
我已经写了好几次内存中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与内存不足的更多相关文章
- 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(三)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...
- 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(二)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...
- 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(一)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...
- SQL Server 内存中OLTP内部机制概述(四)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- SQL Server 内存中OLTP内部机制概述(二)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- SQL Server 内存中OLTP内部机制概述(一)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- 配置内存中OLTP文件组提高性能
在今天的文章里,我想谈下使用内存中OLTP的内存优化文件组来获得持久性,还有如何配置它来获得高性能.在进入正题前,我想简单介绍下使用你数据库里这个特定文件组,内存OLTP是如何获得持久性的. 内存中O ...
- 为什么我还不推荐内存中OLTP给用户
嗯,有些人在看玩这篇文章后会恨我,但我还是要说.1个月来我在内存中OLTP这个里领域里做了大量的工作,很多用户都请求使用这个惊艳的新技术.遗憾的是,关于内存中OLTP没有一个是真的令人激动的——看完你 ...
- SQL Server 内存中OLTP内部机制概述(三)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
随机推荐
- USACO翻译:USACO 2012 JAN三题(3)
USACO 2012JAN(题目三) 一.题目概览 中文题目名称 放牧 登山 奶牛排队 英文题目名称 grazing climb lineup 可执行文件名 grazing climb lineup ...
- 谢欣伦 - OpenDev原创教程 - 媒体开发库libMedia
libMedia是一个免费的简单的媒体开发库,其中的接口类与函数大都以小写的x打头,来源于我的姓氏首字母(谢欣伦). 下载 OpenDev for VS2012 libMedia提供四大功能,一是视频 ...
- 将asp.net core站点发布到IIS上遇到的问题
今天第一次将整个 asp.net core 站点发布到 IIS 上,以前都是发布到 Linux 服务器上. 开始使用 dotnet publish -c release 命令发布,用浏览器访问站点时出 ...
- 一小时包教会 —— webpack 入门指南
什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理. 我们可以 ...
- ReactJS实践(一)—— FrozenUI React化之Loading组件
在前面我们通过四篇文章入门了React的大部分主要API,现在则开始进入实践环节. 实践系列的开篇打算拿我司的FrozenUI来试验,将其部分UI组件进行React化,作为第一篇实践文章,将以较简单的 ...
- Javascript本质第一篇:核心概念
很多人在使用Javascript之前都至少使用过C++.C#或Java,面向对象的编程思想已经根深蒂固,恰好Javascript在语法上借鉴了Java,虽然方便了Javascript的入门,但要深入理 ...
- cache4j轻量级java内存缓存框架,实现FIFO、LRU、TwoQueues缓存模型
简介 cache4j是一款轻量级java内存缓存框架,实现FIFO.LRU.TwoQueues缓存模型,使用非常方便. cache4j为java开发者提供一种更加轻便的内存缓存方案,杀鸡焉用EhCac ...
- Ubuntu 安装OpenERP
网上的都TM不靠谱.... 1.用root登录,修改/etc/apt/sources.list 文件 sudo /etc/apt/sources.list u root 注意一定要加U root否则没 ...
- C语言 · Interval · 求矩阵元素和
问题描述 这里写问题描述. 输入格式 测试数据的输入一定会满足的格式. 例:输入的第一行包含两个整数n, m,分别表示矩阵的行数和列数.接下来n行,每行m个正整数,表示输入的矩阵. 输出格式 要求用户 ...
- Atitit 研发团队建设----福利法案--非物质福利与物质福利法案
Atitit 研发团队建设----福利法案--非物质福利与物质福利法案 1.1. 何为非物质福利法案??1 1.2. 福利类型1 1.2.1. 公共福利1 1.2.2. 个人福利2 1.2.3. 组织 ...