SQLServer2014内存优化表评测

分类: SQL内存表2014-06-20 11:49 1619人阅读 评论(11) 收藏 举报

目录(?)[-]

  1. SQLServer2014的使用基本要求
  2. 内存表基本要求
  3. 内存表与磁盘表的DML对比
  4. 内存表比磁盘表快的原理
  5. 内存表适合的场合
  6. 具有内存优化对象包括内存优化数据文件组的数据库不支持以下 SQL Server 功能注支持AlwaysOn
  7. 内存表与磁盘表DML性能对比
  8. 总结
  9. 附录

内存优化表, 以下简称内存表。

SQLServer2014的使用基本要求

1. .Net Framework 3.5 sp1 ,

2. .Net Framework 4.0

3. 硬盘:>=6G

4. 内存:最小值:1G,推荐:>=4G

5. CPU:最小值:x86:1.0 GHZ, x64:1.4 GHZ

6. 操作系统:Win7、WinServer2008 及以上 (WindowsServer2003不支持)

内存表基本要求

1. 64 位 Enterprise、Developer 或 Evaluation 版 SQL Server 2014。(注:即只有64位系统才能使用内存优化表的功能,32位系统能安装SQL Server2014,但无法使用内存表功能)

2. SQL Server 需要有足够的内存来保留内存优化表和索引中的数据。 若要容纳行版本,您应当提供两倍于内存优化表和索引预期大小的内存量。

内存表与磁盘表的DML对比

操作

磁盘表

内存表

Insert

数据页插入一行

为此表的存储桶加入一行,并加入时间戳

Delete

数据页删除

同上,也是加入一行。但只是一个专门记录删除操作的行。在相同的时间戳里,有两个数据文件,一个记录插入的行,一个记录删除的行,查询时第一个文件即去第二个文件即为真实表数据。

Update

Delete+Insert

Delete+Insert,删除行+插入行

Select

从数据页读

有回收线程不断回收同标识的旧行。

内存表比磁盘表快的原理

1. 内存读取比磁盘读取快;

2. 取消了锁,采用行版本机制,读取和更新不冲突。

内存表适合的场合

需要大量的并行操作的表

内存优化表的限制

1. 不支持的数据类型:varchar(max)、nvarchar(max)、image、xml、text、ntext、rowversion、datetimeoffset、geography、geometry、hierarchyid、sql_variant、UDT;

2. 每行的总字节数不得超过 8060 个字节;

3. 不支持外键或约束检查

4. 支持 IDENTITY(1, 1)。 但是不支持使用 IDENTITY(x, y)(其中 x != 1 或 y != 1 )定义的标识列。

5. 不支持dml触发器

6. 内存优化表中的 (var)char 列必须使用代码页 1252 排序规则。 此限制不适用于 n(var)char 列。 下列代码检索所有 1252 排序规则:

select * from sys.fn_helpcollations()  where collationproperty(name, 'codepage') = 1252;

7. 如果数据库排序规则不是代码页 1252 排序规则,则本机编译的存储过程不能使用 (var)char 类型的参数、局部变量或字符串常量。

8. 无法修改表结构,只能删除表再重建

9. 索引只能建hash非聚焦索引, 不能建聚焦索引。

10. 索引只能在建表时建立,不能重建索引。

具有内存优化对象(包括内存优化数据文件组)的数据库不支持以下 SQL Server 功能。注:支持AlwaysOn

不支持的功能

功能说明

对内存优化表进行数据压缩。

您可以使用数据压缩功能帮助压缩数据库中的数据并帮助减小数据库的大小。

对内存优化表和 HASH 索引进行分区。

已分区表和已分区索引的数据划分为分布于一个数据库中多个文件组的单元。

数据库的内存优化数据文件组上的透明数据加密 (TDE)。

“透明数据加密”(TDE) 可对数据和日志文件执行实时 I/O 加密和解密。

可在拥有内存中 OLTP 对象的数据库上启用 TDE。  如果启用 TDE,则内存中 OLTP 日志记录会被加密。 即使在数据库上启用了 TDE,也不会对耐久性表的检查点文件加密。

复制

对订阅服务器上内存优化表进行的事务复制之外的其他复制配置与引用内存优化表的表或视图不兼容。  如果存在内存优化文件组,则不支持使用 sync_mode=’database snapshot’ 的复制。

多个活动的结果集 (MARS)

内存优化表不支持多个活动结果集 (MARS)。  此错误还可能指示使用了链接服务器。 链接服务器可以使用 MARS。 内存优化表不支持链接服务器。 请直接连接到托管内存优化表的服务器和数据库。

镜像

“数据库镜像”是一种提高 SQL Server 数据库可用性的解决方案。

链接服务器

大容量日志记录

无论数据库处于什么恢复模式,都将始终完整记录针对持久内存优化表的所有操作的日志。

最小日志记录

内存优化表不支持最小日志记录。 

更改跟踪

可在包含内存中 OLTP 对象的数据库上启用更改跟踪。  但是,在内存优化表上的更改不会被跟踪。

DDL 触发器

内存中 OLTP 表和本机编译的存储过程不支持数据库级别和服务器级别的 DDL 触发器。

变更数据捕获 (CDC)

不应在包含内存中 OLTP 对象的数据库上启用 CDC,因为它会阻止某些操作,如 DROP。

内存表与磁盘表DML性能对比

测试环境:

CPU: Intel Core i3-3240 3.40GHz

内存:4.00GB(3.86GB可用)

系统类型: Windows Server 2008 R2 Enterprise 64位

两次测试取平均值, 测试SQL见后面的附录

操作

记录数

磁盘表

内存表

内存表+本地编译的存储过程

Insert

1000000

242.642 s

222.411 s

2.181 s

Delete

1000000

199.538 s

342.365 s

0.866 s

Update

1000000

201.310 s

361.827 s

3.724 s

Select

1000000

8.898 s

9.628 s

8.999 s

总结

效率:内存表对比普通的磁盘表, 在增、删、改方面有非常大的优势, 甚至达到了上百倍!但查询方面并没有太大的区别。

可行性:内存表的限制比较大,比如数据库用了内存表之后就不能使用复制、镜像、链接服务器, 内存表也不能使用触发器、约束, 每行的字节数不能超过8060字节, 内存表的结构和索引建立之后就不能修改等等。 而且必须配合本地编译的存储过程效率才能提升。仅适用于数据库不需要被限制的功能(复制、镜像等), 而且表的增、删、改非常频繁的情况。

SqlServer2014内存表对比oracle 12C的 inmemory 选件, 后者易用性更高( alter table tableName inmemory 即可), 而且其使用对比普通表没有太大区别, 限制很少。

SqlServer2014内存表感觉有些鸡肋, 期待下一版的改进。

附录

以下是性能评测SQL:

[sql] view plaincopy

  1. ------------------------- 1. 建库 -------------------------
  2. USE [master] 
  3. GO 
  4. if exists(select * from sysdatabases where name='DB_TEST_MEMTB')   
  5. DROP DATABASE DB_TEST_MEMTB   
  6. go   
  7. CREATE DATABASE [DB_TEST_MEMTB] 
  8. ON PRIMARY
  9. NAME = N'DB_TEST_MEMTB_DATA', 
  10.     FILENAME = N'e:\db\test\DB_TEST_MEMTB_DATA.mdf', 
  11. SIZE = 512000KB, 
  12.     MAXSIZE = UNLIMITED, 
  13.     FILEGROWTH = 1024KB 
  14. ),  
  15. --下面的文件就是数据流文件了
  16. FILEGROUP [MEM_DIR] CONTAINS MEMORY_OPTIMIZED_DATA  DEFAULT
  17. NAME = N'DB_TEST_MEMTB_DIR', 
  18.     FILENAME =N'e:\db\test\DB_TEST_MEMTB_DIR', 
  19.     MAXSIZE = UNLIMITED 
  20. LOG ON
  21. NAME = N'DB_TEST_MEMTB_LOG', 
  22.     FILENAME = N'e:\db\test\DB_TEST_MEMTB_LOG.ldf', 
  23. SIZE = 512000KB, 
  24.     MAXSIZE = 2048GB, 
  25.     FILEGROWTH = 1024KB 
  26. GO 
  27. ------------------------- 2. 建表和本地编译存储过程 -------------------------
  28. USE DB_TEST_MEMTB 
  29. GO 
  30. -- 1. 建立普通磁盘表
  31. IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[t_disk]') AND type in (N'U')) 
  32. DROP TABLE [dbo].[t_disk] 
  33. GO 
  34. create table [t_disk] 
  35.     c1 int not null primary key, 
  36.     c2 nchar(48) not null
  37. go 
  38. -- 2. 建立内存优化表 (后面的测试不使用本地编译存储过程)
  39. IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[t_mem]') AND type in (N'U')) 
  40. DROP TABLE [dbo].[t_mem] 
  41. GO 
  42. create table [t_mem] 
  43.     c1 int not null primary key nonclustered hash with (bucket_count=10000000), 
  44.     c2 nchar(48) not null
  45. ) with (memory_optimized=on, durability = schema_and_data) 
  46. GO 
  47. -- 3.0 建立内存优化表 (后面的测试使用本地编译存储过程 NATIVE_COMPILATION)
  48. IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[t_mem_nc]') AND type in (N'U')) 
  49. DROP TABLE [dbo].t_mem_nc 
  50. GO 
  51. create table t_mem_nc 
  52.     c1 int not null primary key nonclustered hash with (bucket_count=10000000), 
  53.     c2 nchar(48) not null
  54. ) with (memory_optimized=on, durability = schema_and_data) 
  55. GO 
  56. -- 3.1 本地编译存储过程_insert
  57. IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Proc_t_mem_nc_Insert]') AND type in (N'P', N'PC')) 
  58. DROP PROCEDURE [dbo].[Proc_t_mem_nc_Insert] 
  59. GO 
  60. CREATE PROCEDURE [Proc_t_mem_nc_Insert]  
  61.        @rowcount int, 
  62.        @c nchar(48) 
  63. WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER 
  64. AS
  65. BEGIN ATOMIC  
  66. WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') 
  67. declare @i int = 1 
  68.        while @i <= @rowcount 
  69. begin
  70. INSERT INTO [dbo].t_mem_nc values (@i, @c) 
  71. set @i += 1 
  72. end
  73. END
  74. GO 
  75. -- 3.2 本地编译存储过程_delete
  76. IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Proc_t_mem_nc_delete]') AND type in (N'P', N'PC')) 
  77. DROP PROCEDURE [dbo].[Proc_t_mem_nc_delete] 
  78. GO 
  79. CREATE PROCEDURE [Proc_t_mem_nc_delete] 
  80.     @rowcount int
  81. WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER 
  82. AS
  83. BEGIN ATOMIC  
  84. WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') 
  85. DECLARE @i INT = 1 
  86.        while @i<=@rowcount 
  87. begin
  88. DELETE FROM dbo.t_mem_nc WHERE c1=@i 
  89. set @i += 1 
  90. end
  91. END
  92. GO 
  93. -- 3.3 本地编译存储过程_update
  94. IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Proc_t_mem_nc_update]') AND type in (N'P', N'PC')) 
  95. DROP PROCEDURE [dbo].[Proc_t_mem_nc_update] 
  96. GO 
  97. CREATE PROCEDURE [Proc_t_mem_nc_update] 
  98.     @rowcount INT, 
  99.     @c nchar(48) 
  100. WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER 
  101. AS
  102. BEGIN ATOMIC  
  103. WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') 
  104. DECLARE @i INT = 1 
  105.        while @i<=@rowcount 
  106. begin
  107. UPDATE dbo.t_mem_nc SET c2=@c WHERE c1=@i 
  108. set @i += 1 
  109. end
  110. END
  111. GO 
  112. -- 3.4 本地编译存储过程_select
  113. IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Proc_t_mem_nc_select]') AND type in (N'P', N'PC')) 
  114. DROP PROCEDURE [dbo].[Proc_t_mem_nc_select] 
  115. GO 
  116. CREATE PROCEDURE [Proc_t_mem_nc_select] 
  117. WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER 
  118. AS
  119. BEGIN ATOMIC  
  120. WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') 
  121. SELECT c1,c2 FROM dbo.t_mem_nc 
  122. END
  123. GO 
  124. ------------------------- 3. 效率评测 -------------------------
  125. DECLARE @i INT=1,@iMax INT = 1000000      --最大一百万条记录
  126. DECLARE @v NCHAR(48)='123456789012345678901234567890123456789012345678'
  127. DECLARE @t DATETIME2 = sysdatetime() 
  128. --3.1 insert
  129. --
  130. set nocount on
  131. while @i<=@iMax 
  132. begin
  133. insert into t_disk (c1,c2) values(@i, @v) 
  134. set @i+=1 
  135. end
  136. select 'insert (t_disk): '+ convert(varchar(10),  datediff(ms, @t, sysdatetime())) 
  137. --
  138. set @i=1 
  139. set @t=SYSDATETIME() 
  140. while @i<=@iMax 
  141. begin
  142. insert into t_mem (c1,c2) values(@i, @v) 
  143. set @i+=1 
  144. end
  145. select 'insert (t_mem): '+ convert(varchar(10),  datediff(ms, @t, sysdatetime())) 
  146. --
  147. set @t=SYSDATETIME() 
  148. exec [Proc_t_mem_nc_Insert]  
  149.        @rowcount=@iMax, 
  150.        @c=@v 
  151. select 'insert (t_mem_nc): '+ convert(varchar(10),  datediff(ms, @t, sysdatetime())) 
  152. --结果:
  153. --insert (t_disk):   242111
  154. --insert (t_mem):    221358
  155. --insert (t_mem_nc):   2147
  156. --insert (t_disk):   243174
  157. --insert (t_mem):    223465
  158. --insert (t_mem_nc):   2214
  159. --3.2 update
  160. --时间较长,故分段执行另设变量
  161. DECLARE @u INT=1,@uMax INT = 1000000      --最大一百万条记录
  162. DECLARE @uv NCHAR(48)='1234567890123456789012345678901234567890abcdefgh'
  163. DECLARE @ut DATETIME2 = sysdatetime() 
  164. set nocount on
  165. while @u<=@uMax 
  166. begin
  167. update t_disk set c2=@uv where c1=@u 
  168. set @u+=1 
  169. end
  170. select 'update (t_disk): '+ convert(varchar(10),  datediff(ms, @ut, sysdatetime())) 
  171. --
  172. set @u=1 
  173. set @ut=SYSDATETIME() 
  174. while @u<=@uMax 
  175. begin
  176. update t_mem set c2=@uv where c1=@u 
  177. set @u+=1 
  178. end
  179. select 'update (t_mem): '+ convert(varchar(10),  datediff(ms, @ut, sysdatetime())) 
  180. --
  181. set @ut=SYSDATETIME() 
  182. exec [Proc_t_mem_nc_Update]  
  183.        @rowcount=@uMax, 
  184.        @c=@uv 
  185. select 'update (t_mem_nc): '+ convert(varchar(10),  datediff(ms, @ut, sysdatetime())) 
  186. --update (t_disk):    199369
  187. --update (t_mem):     368297
  188. --update (t_mem_nc):    3715
  189. --update (t_disk):    203251
  190. --update (t_mem):     355356
  191. --update (t_mem_nc):    3732
  192. --3.3 select
  193. DECLARE @st DATETIME2 = sysdatetime() 
  194. set nocount on
  195. --
  196. select c1,c2 from t_disk 
  197. select 'select (t_disk): '+ convert(varchar(10),  datediff(ms, @st, sysdatetime())) 
  198. set @st=SYSDATETIME() 
  199. select c1,c2 from t_mem 
  200. select 'select (t_mem): '+ convert(varchar(10),  datediff(ms, @st, sysdatetime())) 
  201. set @st=SYSDATETIME() 
  202. exec Proc_t_mem_nc_select 
  203. select 'select (t_mem_nc): '+ convert(varchar(10),  datediff(ms, @st, sysdatetime())) 
  204. --select (t_disk):   8934
  205. --select (t_mem):    9278
  206. --select (t_mem_nc): 8889
  207. --select (t_disk):   8861
  208. --select (t_mem):    9978
  209. --select (t_mem_nc): 9108
  210. --3.4 delete
  211. --时间较长,故分段执行另设变量
  212. DECLARE @d INT=1,@dMax INT = 1000000      --最大一百万条记录
  213. DECLARE @dt DATETIME2 = sysdatetime() 
  214. set nocount on
  215. while @d<=@dMax 
  216. begin
  217. delete from t_disk where c1=@d 
  218. set @d+=1 
  219. end
  220. select 'delete (t_disk): '+ convert(varchar(10),  datediff(ms, @dt, sysdatetime())) 
  221. --
  222. set @d=1 
  223. set @dt=SYSDATETIME() 
  224. while @d<=@dMax 
  225. begin
  226. delete from t_mem where c1=@d 
  227. set @d+=1 
  228. end
  229. select 'delete (t_mem): '+ convert(varchar(10),  datediff(ms, @dt, sysdatetime())) 
  230. --
  231. set @dt=SYSDATETIME() 
  232. exec [dbo].[Proc_t_mem_nc_delete] @rowcount=@dMax 
  233. select 'delete (t_mem_nc): '+ convert(varchar(10),  datediff(ms, @dt, sysdatetime())) 
  234. --delete (t_disk): 199438
  235. --delete (t_mem):  342959
  236. --delete (t_mem_nc):  928
  237. --delete (t_disk): 199637
  238. --delete (t_mem):  341771
  239. --delete (t_mem_nc):  803

原文地址:http://blog.csdn.net/yenange/article/details/32705347

SQLServer2014内存优化表评测的更多相关文章

  1. 试试SQLSERVER2014的内存优化表

    试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技 ...

  2. SQLSERVER2014的内存优化表

    SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技术来支持大规模OLTP工作负载. 就算如此, ...

  3. SQLServer 2014 内存优化表

    内存优化表是 SQLServer 2014 的新功能,它是可以将表放在内存中,这会明显提升DML性能.关于内存优化表,更多可参考两位大侠的文章:SQL Server 2014新特性探秘(1)-内存数据 ...

  4. 试试SQLServer 2014的内存优化表

    SQL Server2014存储引擎:行存储引擎,列存储引擎,内存引擎 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据 ...

  5. 试试SQLServer 2014的内存优化表(转载)

    SQL Server2014存储引擎:行存储引擎,列存储引擎,内存引擎 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据 ...

  6. In-Memory:内存优化表的事务处理

    内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...

  7. In-Memory:内存优化表 DMV

    在内存优化表的DMV中,有两个对象ID(Object ID): xtp_object_id 是内部的内存优化表(Internal Memory-Optimized Table)的ID,在对象的整个生命 ...

  8. Sql server2014 内存优化表 本地编译存储过程

    参考文献:http://www.infoq.com/cn/news/2013/09/Compiled-Queries http://www.bianceng.cn/database/SQLServer ...

  9. SQL Server 2014内存优化表的使用场景

    SQL Server 2014内存优化表的使用场景 最近一个朋友找到走起君,咨询走起君内存优化表如何做高可用的问题 大家知道,内存优化表是从SQL Server 2014开始引入,可能大家对内存优化表 ...

随机推荐

  1. C++数据结构之Stack(栈)

    stack,栈,是好比堆积木似的数据结构,从上之下堆积,取出时按"LIFO"-last int first out后进先出的规则.栈一般为线程所独有,也就是每个线程有其自有的栈,与 ...

  2. hdu 2041

    ps:这道题之前一直没思路,有大神提醒我用递推,但当时没搞清...今天做了那个小蜜蜂..才懂得用递推做这道题.. 代码: #include "stdio.h"long long d ...

  3. python中的namespace

    python中的名称空间是名称(标识符)到对象的映射. 具体来说,python为模块.函数.类.对象保存一个字典(__dict__),里面就是重名称到对象的映射. 可以参看下面python程序的输出: ...

  4. 用C++,调用浏览器打开一个网页

    http://blog.csdn.net/heaven13483/article/details/9369029

  5. 省赛13 Alice and Bob(二进制,找规律)

    题意:多项式相乘,(a0x+1)(a1x^2+1)(a2x^4+1),问x的m次方的系数是多少,当时没做出来,搜的某大神的博客,好理解. 思路:多列几个式子就能明白规律了: (a0x+1)(a1x^2 ...

  6. UNION语句查询(转载)

    联合查询   在对数据信息进行操作时,有时需要将不同数据表中的数据信息组合在一起,这时需要使用联合查询.联合查询指的是将多表中的行数据组合在一个数据集中进行显示.本节将讲解有关联合查询方面的相关知识. ...

  7. Bat脚本处理ftp超强案例解说

    Bat脚本处理ftp超强案例解说 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://369369.blog.51cto.com/31 ...

  8. 【转】Paxos算法深入分析

    http://blog.csdn.net/anderscloud/article/details/7175209 在分布式系统设计领域,Paxos可谓是最重要一致性的算法.Google的大牛们称   ...

  9. H - 放苹果

      Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Des ...

  10. hadoop问题锦集(一)-搭建集群环境时的常见问题

    1.没有主机的路由 1.namenode与datanode之间ping不通了 2.防火墙得关闭: ufw status ufw disabled 2. ssh localhost ssh:connec ...