热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLServer内存中OLTP内部机制概述(一)

内存中OLTP(项目名为“Hekaton”)是一个新的完全集成到SQLServer中的数据库引擎组件。它专为访问内存常驻数据的OLTP工作负荷而进行优化。内存中OLTP有助于OLT

----------------------------我是分割线-------------------------------

本文翻译自微软白皮书《SQL Server In-Memory OLTP Internals Overview》:http://technet.microsoft.com/en-us/library/dn720242.aspx

----------------------------我是分割线-------------------------------

SQL Server 内存中OLTP内部机制概述

摘要:

内存中OLTP(项目名为“Hekaton”)是一个新的完全集成到SQL Server中的数据库引擎组件。它专为访问内存常驻数据的OLTP工作负荷而进行优化。内存中OLTP有助于OLTP工作负荷实现显著的性能改进,并减少了处理时间。可以通过将表声明成“内存中优化”来启用内存中OLTP的功能。内存优化表完全支持事务,并且可以使用Transact-SQL进行访问。 Transact-SQL存储过程可以被编译成机器代码从而进一步提升内存优化表的性能。引擎针对高并发进行设计,并使阻塞最小化。

简介

在最初设计SQL Server的时候假定主内存是非常昂贵的,因此除非当数据确实需要进行处理,否则数据都驻留在磁盘上。由于内存价格在过去的30年中已经大幅下降,这种假设已不再有效。与此同时,多核服务器也已不再昂贵,所以如今人们只需花费不到5万美元就可以购买到拥有32个内核和1TB内存的服务器。由于生产环境的许多(尽管并不是绝大多数)OLTP数据库能够完全装进1TB的内存中,我们需要重新评估将数据存储在磁盘上的好处,以及当读取数据到内存中进行处理时所导致的I/O开销。此外,OLTP数据库在更新数据并且需要将数据写回到磁盘时,也会产生开销。内存优化表的存储方式与基于磁盘的表完全不同,并且这些新的数据结构有助于更加有效地访问和处理数据。

由于更多可用内存和更多内核的这种趋势,微软SQL Server团队开始构建一种针对大量主内存和多核CPU进行优化的数据库引擎。本文给出了这个新的数据库引擎功能:内存中OLTP的技术概述。

有关内存中OLTP的更多信息,请参阅在内存中 OLTP(内存中优化)。

设计注意事项与目的

开发一个真正的内存数据库的举动由三种基本的需求所驱动:1)将工作负荷所需的大部分或全部数据放到内存中,2)对于数据操作更低的延迟时间,3)针对特定类型的工作负荷的专业数据库引擎需要为那些工作负荷进行优化。摩尔定律已经影响了内存的成本,允许主内存足够大以满足需求(1)及部分满足需求(2)。 (更大的内存降低了读取的延迟,但并没有影响传统数据库系统所需的写入到磁盘需要的延迟)。内存中OLTP的其他功能大大提高了数据修改操作的延迟。专为特定类型工作负荷设计的系统能够比通用系统表现优异10倍或者10倍以上,正是这样的认知驱动了专业数据库引擎的需求。最专业的系统,包括那些用于复杂事件处理(CEP, Complex Event Processing),DW/BI和OLTP的系统,都通过专注于内存中的结构来优化数据结构和算法。

微软之所以开发了内存中OLTP的功能,主要来源于这样一个事实即主内存大小正以极快的速度增长,并变得更加便宜。此外,由于64位架构和多核处理器的普及,有理由认为大多数(尽管并不是所有)OLTP数据库或者对性能敏感的整个工作数据集可以完全在内存中驻留。最大的金融,在线零售和航空订票系统中的许多系统的大小降低至500GB与5TB之间,工作集也显著变小。截至2012年,即使是一个双插槽服务器也可以通过采用32GB的DIMMs(Dual In-line Memory Module)来容纳2TB 的DRAM(Dynamic Random Access Memory)(比如IBM x3680 X5)。展望未来,在未来几年内,以不到5美元/GB的成本来构建拥有1-10 PB容量的基于DRAM的分布式系统,是完全有可能的。非易失性的RAM变为可行也只是一个时间问题。

如果一个应用程序的大多数或所有数据都能够完全驻留在内存中,那么SQL Server优化器从最初版本就开始使用的成本计算规则将变得几乎完全过时,因为规则假定所有访问的数据页都可能需要从磁盘进行物理读。如果不需要从磁盘进行读取,优化器则可以使用不同的成本计算算法。此外,如果没有磁盘读取所需的等待时间,其他等待的统计信息,比如等待锁被释放,等待闩锁可用或者等待日志写入完成,就会变得无比庞大。内存中OLTP解决了所有的这些问题。内存中OLTP消除了等待锁释放的问题,采用了一种新型的多版本乐观并发控制。内存中OLTP产生比原先少得多的日志数据,并且只需要更少的日志写入,从而减少了等待日志写入的延迟。

术语

SQL Server 2014的内存中OLTP功能涉及到一系列与使用内存优化表相关的技术。与内存优化表相对的表将被称为基于磁盘的表,这正是SQL Server一直所提供的。使用的术语包括:

  • 内存优化表:是指采用了新的数据结构的表,这种数据结构作为内存中OLTP的一部分,将在本文中详细描述。
  • 基于磁盘的表:与内存优化表相对,采用SQL Server此前一直使用的数据结构,以从磁盘读取和写入所需的8K大小的数据页作为一个单元。
  • 本机编译的存储过程:是指内存中OLTP功能支持的一种对象类型,被编译为机器代码,并且比起只使用内存优化表,本机编译的存储过程有进一步增进性能的潜力。与之对应的是SQL Server此前一直使用的解释型的Transact-SQL存储过程。本机编译的存储过程只能引用内存优化表。
  • 交叉容器事务:是指同时引用内存优化表和基于磁盘的表的事务。
  • 互操作:是指引用内存优化表的解释型的Transact-SQL

功能概述

在使用内存中OLTP对数据进行大多数的处理操作时,你可能并不会察觉到正在使用的是内存优化表而不是基于磁盘的表。但是,如果数据存储在内存优化表中,SQL Server处理数据的方式非常不同。在本节中,我们将看到与SQL Server中基于磁盘的操作和数据不同的内存中OLTP运作原理和数据处理方式的概述。我们也将简单介绍来自于竞争对手的一些内存优化数据库的解决方案,并指出SQL Server的内存中OLTP与它们的区别。

内存中OLTP有何特殊之处

虽然内存中OLTP与SQL Server关系引擎集成,并且可以使用相同的接口透明地进行访问,但它的内部行为和功能有很大的不同。图1给出了包含内存中OLTP组件的SQL Server引擎的概述。

,

图1  包含内存中OLTP组件的SQL Server引擎

请注意,对于内存优化表或者基于磁盘的表,无论是将调用本地编译的存储过程或解释型的Transact-SQL,客户端应用程序连接到TDS处理程序都采用相同的方式。你可以看到,解释型的Transact-SQL可以使用互操作功能来访问内存优化表,但本地编译存储过程只能访问内存优化表。

内存优化表

内存优化表和基于磁盘的表之间最重要的区别是,当访问内存优化表时,数据页不需要从磁盘读入高速缓存。所有的数据都始终被存储在内存中。仅用于恢复的目的的检查点文件组(数据和差异文件对)创建在驻留在内存优化文件组中的文件中,记录了数据更改的跟踪,而检查点文件是只能被附加的。

在内存优化表上的操作与在基于磁盘的表的操作使用同样的事务日志,和往常一样,事务日志被存储在磁盘上。万一系统崩溃或者服务器关机,内存优化表中的数据行可以通过检查点文件和事务日志重建。

通过使用一个名为SCHEMA_ONLY的选项,内存中OLTP能够选择创建一个非持久的和不记录日志的表。如这个选项名所示,即便数据是非持久的,表架构也将是持久的。这些表在事务处理期间不需要任何IO操作,但是只有当SQL Server运行时,数据在内存中可用。一旦SQL Server关机或者AlwaysOn可用性组进行故障转移,这些表中的数据会丢失。当它们所属的数据库进行恢复时,表将会被重建,而表中没有数据。这些表可能会是有用的,例如,ETL场景里的临时表或者用于存储Web服务器会话状态的临时表。虽然数据是非持久的,但这些表上的操作符合事务其他所有的要求:原子性,隔离性和一致性。我们将会在创建表的章节看到创建一个非持久表的语法。

内存优化表上的索引

内存优化表上的索引并不按照传统的B树结构进行存储。内存优化表支持非聚集哈希索引,非聚集哈希索引以哈希表的方式存储,哈希表中拥有将相同哈希值的所有数据行与内存优化的非聚集索引连接起来的链接列表,而内存优化的非聚集索引使用的是特殊的BW树进行存储。非聚集哈希索引针对点查找进行优化,而内存优化非聚集索引则为检索值的范围和行排序提供支持,并优化了使用不等谓词的查询的性能。

每个内存优化表都必须至少有一个索引,因为正是索引将所有数据行组合成一张表。内存优化表永远不会像基于磁盘的堆表那样存储成无组织的数据行集合。

索引永远不会存储在磁盘上,在磁盘上的检查点文件中也不会体现,并且在索引中的操作永远不会被日志记录。与基于磁盘的表上的B树索引相同,在内存优化表上的所有修改操作发生时,索引是自动进行维护的,但一旦SQL Server重新启动,由于数据会加载到内存中,则内存优化表上的索引会被重建。

并发性的改进

当访问内存优化表时,SQL Server实现了一个乐观的多版本并发控制。尽管SQL Server以前通过在SQL Server 2005中引入的基于快照的隔离级别,从而号称支持乐观并发控制,但这些所谓的乐观方式在数据修改操作的过程中的确需要获取锁。对于内存优化表,不需要获取锁,从而没有因为阻塞而产生的等待。

注意,这并不意味着在使用内存优化表时,不可能产生等待。仍会存在其他等待类型,比如在事务结束时等待日志写入完成。不过,在对内存优化表进行更改时,内存优化表的日志记录比起基于磁盘的表更有效率的多,因此等待时间会更短。而且从磁盘读取数据永远不会有等待,也没有因为数据行上的锁而产生的等待。

本地编译的存储过程

当使用拥有内存优化表的本机编译的存储过程时,能获得最好的执行性能。不过,相对于解释型的代码可供使用的丰富的功能集,本地编译存储过程内部允许的Transact-SQL语言结构有一些限制。此外,本机编译存储过程只能访问内存优化表,并不能引用基于磁盘的表。

内存中OLTP仅仅只是DBCC PINTABLE的改进?

DBCC PINTABLE是旧版本的SQL Server提供的功能,一旦数据页从磁盘中读取,这张被“固定”的表里的任何数据页就不会从内存中移除。这些数据页需要被初始化读取,所以这样的表被访问总是会有第一次读取数据页的成本。这些固定的表与任何其他基于磁盘的表并无任何不同。它们需要相同数量的锁、闩锁和日志记录,也使用相同的索引结构,这些索引同样也需要锁和日志记录。内存中OLTP的内存优化表与SQL Server的基于磁盘的表则完全不同,它们使用不同的数据和索引结构,不使用锁,并且日志记录这些内存优化表的更改比起基于磁盘的表效率更高。

竞争对手的产品

对于处理OLTP数据,有两种类型的专业引擎。第一类是主内存数据库。 Oracle有TimesTen,IBM有solidDB,还有许多其它产品主要是针对嵌入式数据库空间。第二类是应用程序高速缓存或者键值存储(例如,Velocity–App Fabric Cache和GigaSpaces),利用应用程序和中间层的内存来降低数据库系统的工作负荷。这些缓存逐渐变得更为复杂,并拥有类似事务、范围索引和查询这样的数据库功能(例如GigaSpaces已经拥有了这些功能)。同时,数据库系统拥有缓存功能,比如高性能哈希索引和跨多服务器集群的扩展(比如VoltDB)。内存中OLTP引擎意在提供这两种类型引擎中各自的优点。可以认为内存中OLTP拥有缓存的性能和数据库的功能。它支持在内存中存储表和索引,这样你就可以将整个数据库建成一个完整的内存中的系统。它也提供了高性能索引和日志记录,以及其它特性以显著提高查询的执行性能。

SQL Server的内存中OLTP提供了极少竞争对手产品能够提供的以下功能:

  • 内存优化表和基于磁盘的表之间的集成,迁移到内存驻留数据库可以逐步进行,只将最关键的表和存储过程创建成内存优化的对象。
  • 本机编译的存储过程为基本的数据处理操作的执行时间提供了数量级的改进
  • 内存优化的非聚集哈希索引和内存优化的非聚集索引都专门为主内存访问进行了优化
  • 不在数据页上存储数据,不需要数据页闩锁。
  • 对任何操作都没有锁或者闩锁的真正多版本乐观并发控制

SQL Server内存中OLTP与竞争对手产品设计最显著的区别是“互操作”的集成。在一个典型的高端OLTP工作负荷中,性能瓶颈主要集中在一些特定的区域,比如一小部分的表和存储过程。迫使将整个数据库驻留在内存中将是昂贵和低效的。但到目前为止,其他主要的竞争产品都采用这种方法。对于SQL Server,高性能和高竞争区域可以迁移到内存中OLTP,那么在这些内存优化表上的操作(存储过程)可以在本地进行编译从而达到最大的业务处理性能。

内存中OLTP改进的另一个关键是移除了内存优化表的数据页结构。这从根本上将数据操作算法从基于磁盘优化改变成基于内存和缓存优化。正如前面提到的,关于内存中OLTP的困惑之一是,它只像“DBCC PINTABLE”那样简单的将表锁定在缓冲池中。然而,即使数据页被强制驻留内存中时,许多竞争产品仍然采用数据页结构。例如SAP的HANA仍使用16KB大小的数据页来处理内存中数据行的存储,在高性能环境下,这从本质上仍需要忍受数据页闩锁争用的影响。

---------------------------待续-------------------------------

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


推荐阅读
  • MongoVUE基础操作指南:轻松上手数据库管理
    本文介绍了MongoVUE的基础操作,旨在帮助用户轻松掌握数据库管理技巧。MongoVUE是一款功能强大的MongoDB客户端工具,虽然需要注册,但其用户友好的界面和丰富的功能使其成为许多开发者的首选。文中详细解释了安装步骤、基本配置以及常见操作方法,并对一些常见的问题进行了修正和补充,确保用户能够快速上手并高效使用MongoVUE进行数据库管理。 ... [详细]
  • 理解和应用HTTP请求中的转发与重定向机制
    在HTTP请求处理过程中,客户端发送请求(通常简称为req),服务器进行相应处理后返回响应(通常简称为res)。理解和应用客户端的转发与重定向机制是前端开发的重要内容。这两种机制在Web开发中具有关键作用,能够有效管理和优化用户请求的处理流程。转发机制允许服务器内部将请求传递给另一个资源,而重定向则指示客户端向新的URL发起新的请求,从而实现页面跳转或资源更新。掌握这些技术有助于提升应用的性能和用户体验。 ... [详细]
  • 如何在Mac上构建高效的本地服务器环境
    在Mac上构建高效的本地服务器环境,首先需要了解基本步骤:1. 配置目录基础;2. 启动Apache服务;3. 添加自定义文档至本地服务器;4. 查看自定义效果。此外,还可以通过手机或其他电脑访问本机服务器,以确保跨设备的兼容性和调试效果。Mac系统自带的Apache服务为本地开发提供了便捷的工具,本文将详细介绍每个步骤的具体操作方法。 ... [详细]
  • CAS 机制下的无锁队列设计与实现 ... [详细]
  • 本文详细介绍了在 Vue.js 前端框架中集成 vue-i18n 插件以实现多语言支持的方法。通过具体的配置步骤和示例代码,帮助开发者快速掌握如何在项目中实现国际化功能,提升用户体验。同时,文章还探讨了常见的多语言切换问题及解决方案,为开发人员提供了实用的参考。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 本文全面解析了 gRPC 的基础知识与高级应用,从 helloworld.proto 文件入手,详细阐述了如何定义服务接口。例如,`Greeter` 服务中的 `SayHello` 方法,该方法在客户端和服务器端的消息交互中起到了关键作用。通过实例代码,读者可以深入了解 gRPC 的工作原理及其在实际项目中的应用。 ... [详细]
  • 在Python网络编程中,多线程技术的应用与优化是提升系统性能的关键。线程作为操作系统调度的基本单位,其主要功能是在进程内共享内存空间和资源,实现并行处理任务。当一个进程启动时,操作系统会为其分配内存空间,加载必要的资源和数据,并调度CPU进行执行。每个进程都拥有独立的地址空间,而线程则在此基础上进一步细化了任务的并行处理能力。通过合理设计和优化多线程程序,可以显著提高网络应用的响应速度和处理效率。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 【Linux进阶指南】第一阶段第三课:体验与部署Ubuntu系统
    在正式踏上Linux学习之旅之前,本课程将引导你深入体验和部署Ubuntu系统。通过详细的操作步骤和实践演练,你将掌握Ubuntu的基本安装、配置及常用命令,为后续的进阶学习打下坚实的基础。此外,课程还将介绍如何解决常见问题和优化系统性能,帮助你更加高效地使用Ubuntu。 ... [详细]
  • 捕获并处理用户输入数字时的异常,提供详细的错误提示与指导
    在用户输入数字时,程序能够有效捕获并处理各种异常情况,如非法字符或格式错误,并提供详尽的错误提示和操作指导,确保用户能够准确输入有效的数字数据。通过这种方式,不仅提高了程序的健壮性和用户体验,还减少了因输入错误导致的系统故障。具体实现中,使用了Java的异常处理机制,结合Scanner类进行输入读取和验证,确保了输入的合法性和准确性。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 通过 NuGet 获取最新版本的 Rafy 框架及其详细文档
    为了帮助开发者更便捷地使用Rafy领域实体框架,我们已将最新版的Rafy框架程序集上传至nuget.org,并同步发布了最新版本的Rafy SDK至Visual Studio。此外,我们还提供了详尽的文档和示例,以确保开发者能够快速上手并充分利用该框架的强大功能。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 概率与期望动态规划的深入探讨与应用分析
    本文深入探讨了概率与期望动态规划的基本原理及其在实际问题中的应用。概率是指某一事件发生的可能性大小,用P(A)表示。若某一事件的所有可能结果共有n种,且每种结果出现的概率相等,而事件A包含其中的m种结果,则该事件的概率P(A)为m/n。例如,在投掷骰子的情况下,如果事件A定义为掷出偶数点,由于共有3种偶数点(2、4、6),而总共有6种可能的结果,因此P(A)为1/2。文章进一步分析了概率与期望动态规划在复杂场景下的建模方法和求解策略,并通过具体实例展示了其在决策优化和风险管理中的应用价值。 ... [详细]
author-avatar
新手村一霸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有