SQL Server专家评测:内存优化表 VS 磁盘表

日期: 2015-10-13 作者:Basit Farooq翻译:冯昀晖 来源: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……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

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:比较内存优化表和磁盘表的结果

作者

Basit Farooq
Basit Farooq

资深数据库管理员、培训师和技术撰稿人,具有十多年微软SQL Server平台的开发、技术培训和数据库管理的经验。

相关推荐