编者注:Basit Farooq是一名具有十多年IT经验的SQL Server专家。他对内存优化表(memory-optimized table)和磁盘表(disk-based table)进行了一系列的性能测试,结果都显示内存优化表的性能高于磁盘表。 内存OLTP(In-memory OLTP)专为提升OLTP性能并降低整体处理时间而设计,该功能是在SQL Server 2014中推出的。到SQL Server 2016版本的时候,内存OLTP有了进一步改进。
内存OLTP支持我们在传统关系数据库中创建内存优化表。据微软公司表示,现有OLTP负载的性能只要简单改用内存OLTP引擎就可以提升50……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
编者注:Basit Farooq是一名具有十多年IT经验的SQL Server专家。他对内存优化表(memory-optimized table)和磁盘表(disk-based table)进行了一系列的性能测试,结果都显示内存优化表的性能高于磁盘表。
内存OLTP(In-memory OLTP)专为提升OLTP性能并降低整体处理时间而设计,该功能是在SQL Server 2014中推出的。到SQL Server 2016版本的时候,内存OLTP有了进一步改进。内存OLTP支持我们在传统关系数据库中创建内存优化表。据微软公司表示,现有OLTP负载的性能只要简单改用内存OLTP引擎就可以提升50倍。在本文中,我们将针对每种方案运行数据增删改查操作,比较内存优化表(memory-optimized table)和磁盘表(disk-based table)的性能。
演示准备
在本次演示中,我们将创建一个测试数据库,其中包含有内存优化文件组。然后我们使用这个数据库存储演示用表和存储过程。我们可以在SQL Server管理器(SSMS)中输入并执行Transact-SQL脚本来创建测试数据库(如图1)。这里我们用的数据库名称是“PerfTestDB”。
图1:创建PerfTestDB数据库的T-SQL代码
除了创建“PerfTestDB”数据库,上面的脚本还设置给数据库添加了内存优化文件组(MEMORY_OPTIMIZED_DATA参数)。内存优化文件组的名称是“PerfTestDB_Mem_Optimized”。如果你想在数据库中创建内存优化表,文件组是必须要的。
创建数据库以后,我们来创建演示用表。使用如下图2脚本:
图2:在PerfTestDB数据库中创建表的T-SQL脚本
该脚本在“PerfTestDB”数据库中创建了如下两个表:
- dbo.OnDisk:普通数据库表,数据保存在磁盘上。
- dbo.InMemory:内存表,数据保留在内存中。
这两个表的结构完全相同。唯一的差异就是数据存储位置,一个把数据保存在磁盘,另一个表在内存中保存数据。
性能测试第一项:插入操作
现在我们来运行第一项测试。我们将给两个表分别插入一百万行数据,使用SQL Profiler在后台运行脚本执行该操作。然后我们来检查每个表每次插入操作所消耗的时间和资源。
在SSMS中,我运行了如下Transact-SQL脚本,在磁盘表(dbo.OnDisk)中插入了一百万行数据。
图3:在dbo.OnDisk表中插入一百万行数据的T-SQL脚本
接下来,我在SSMS中运行如下Transact-SQL脚本,在内存优化表(dbo.InMemory)中插入一百万行数据。
图4:在dbo.InMemory表中插入一百万行数据的T-SQL脚本
图5展示了SQL Profiler的执行结果,我们可以看到插入操作在内存优化表中运行比磁盘表中更快。此外,针对内存优化表的插入操作没有产生磁盘I/O操作,而磁盘表产生的磁盘I/O活动相当多。最终,内存优化表使用的CPU资源也少于磁盘表。
图5:“dbo.OnDisk ”表和“dbo.InMemory”表插入语句运行性能比较
性能测试第二项:查询操作
在本项测试中,我们将对两个表运行两个“SELECT”语句。第一个“SELECT”语句根据指定的“WHERE”从句条件具体值返回一些数据行。第二个“SELECT”语句根据“WHERE”从句指定的值范围返回数据行。
我们仍然在后台运行SQL Profile来从磁盘表(dbo.InDisk)中查询返回多行数据,如图6:
图6:查询“dbo.InDisk”返回多行数据的T-SQL代码
要从内存优化表(dbo.InMemory)中查询返回多行数据,我运行了如下“SELECT”语句,仍然用SQL Profiler在后台运行。
图7:T-SQL代码查询dbo.InMemory表返回多行数据
SQL Profiler执行结果如下图,可见针对内存优化表的查询语句比磁盘表运行更快,也耗用更少资源。
图8:dbo.InDisk表和dbo.InMemory表查询语句运行情况
性能测试第三项:更新和删除操作
在最后的测试中,我对两个表运行了更新和删除语句,看他们比较效果如何。我们仍然用SQL Profiler在后台运行,“UPDATE”和“DELETE”脚本如图。
图9:在dbo.InDisk表中执行更新和删除的T-SQL代码
同样在内存优化表(dbo.InMemory)中执行更新和删除数据,我们仍然后台运行SQL Profiler执行下面的“UPDATE”和“DELETE”语句:
图10:在dbo.InMemory表中运行“UPDATE”和“DELETE”的脚本代码
SQL Profiler展示结果如图11,在所有考察项中,内存优化表都完胜磁盘表。
图11:比较内存优化表和磁盘表的结果
翻译
相关推荐
-
内存中OLTP变形记:在SQL Server 2016沐浴重生
内存中OLTP是在SQL Server 2014版本中首次推出的,在目前最新发布的SQL Server 2016中提供了很多重要的改进,让我们一起来了解主要有哪些重要的提升……
-
SQL Server 2016新变化:内存中OLTP功能大改进
SQL Server 2016的许多功能得到改进,内存中OLTP(in-memory OLTP)也不例外,包括扩展性、性能以及扩展T-SQL用于使用和管理内存优化表的功能方面。
-
微软超越IBM 成为关系型数据库市场No.2
根据Gartner的最新数据显示,在2013年微软已经超越IBM成为关系型数据库市场份额第二的厂商。
-
深入探索SQL Server 2014 内存OLTP
SQL Server 2014 内存OLTP引擎,即此前的微软“Hekaton”项目,它可以在一个传统关系型数据库中创建内存优化OLTP表。