sql server2014中的内存优化表/内存表(续写) SQL Server 2014内存优化表的使用场景

【0】基本介绍

【0.1】概述介绍

官网:https://docs.microsoft.com/zh-cn/sql/relational-databases/in-memory-oltp/introduction-to-memory-optimized-tables?view=sql-server-ver15

内存优化表是使用 CREATE TABLE (Transact-SQL) 创建而成的表。

默认情况下,内存优化表具有完全持久性。与(传统)基于磁盘的表上的事务一样,内存优化表上的事务具有完全原子性、一致性、隔离性和持久性 (ACID)。 

内存优化表和本机编译的存储过程仅支持一部分 Transact-SQL 功能。

自 SQL Server 2016 起以及在 Azure SQL 数据库中,内存中 OLTP 特定的 排序规则或代码页 没有任何限制。

内存优化表的主存储器是主要内存。 从内存读取表中的行和将这些行写入内存。 表数据的另一个副本维护在磁盘上,但仅用于持续性目的。 

有关持久表的详细信息,请参阅 创建和管理用于内存优化的对象的存储 。 在数据库恢复期间(例如, 在服务器重启后),内存优化表中的数据只能从磁盘读取。

为了获得更大的性能提升,内存中 OLTP 支持事务持续性延迟的持久表。 延迟的持久事务在提交事务并将控制权归还客户端后不久即保存到磁盘。 作为提高性能的代价,在服务器崩溃或故障转移过程中将丢失已提交但未保存到磁盘的事务。

除了默认持久的内存优化表之外, SQL Server 还支持非持久的内存优化表,不记录这些表的日志且不在磁盘上保存它们的数据。 这意味着这些表上的事务不需要任何磁盘 IO,但如果服务器崩溃或进行故障转移,则无法恢复数据。

内存中 OLTP 与 SQL Server 集成,以便在所有方面(如开发、部署、可管理性和可支持性)提供无缝体验。 数据库可包含内存中对象以及基于磁盘的对象。

内存优化表中的行是版本化的。 这意味着表中的每行都可能有多个版本。 所有行版本均维护在同一个表数据结构中。 行版本控制用于实现对同一行的并发读取和写入。 有关对同一行的并发读取和写入的更多信息,请参阅 内存优化表中的事物

下图展示多版本控制。 该图显示了一个包含三行的表,其中,每行都有不同的版本。

多版本控制。

该表有三行:r1、r2 和 r3。 r1 有三个版本,r2 有两个版本,r3 有四个版本。 注意,同一行的不同版本不必占用连续的内存位置。 不同的行版本可分散到整个表数据结构中。

可将内存优化的表数据结构视为一个行版本集合。 基于磁盘的表中的行以页和区形式组织,各个行借助页码和页偏移量进行寻址,而内存优化表中的行版本则借助 8 字节的内存指针进行寻址。

可通过以下两种方式访问内存优化表中的数据:

  • 通过本机编译的存储过程。

  • 通过本机编译的存储过程之外的解释型 Transact-SQL。 这些 Transact-SQL 语句可位于解释型存储过程内,也可以是临时 Transact-SQL 语句

【0.2】性质概念总结

(1)内存优化表具有完全持久性(可以设置持久或者完全内存),且具有事务ACID属性。且支持延迟性事务(参考:sql server2014中的delayed_durability

(2)如果重启了,内存优化表中的数据只能从磁盘读取。

(3)无锁机制,  并发(如闩锁争用或阻塞)影响

(4)内存优化表中的行是版本化的(且默认是快照隔离级别),不占用tempdb空间

(5)内存优化表可以额外支持下列方式

  • 通过本机编译的存储过程。

  • 通过本机编译的存储过程之外的解释型 Transact-SQL。 这些 Transact-SQL 语句可位于解释型存储过程内,也可以是临时 Transact-SQL 语句。

【1】基本使用

【1.0】使用大概步骤与限制

步骤:

(1)创建数据库和MEMORY_OPTIMIZED_DATA文件组(alter database add filegroup,每个数据库只能有一个MEMORY_OPTIMIZED_DATA文件组!!)

(2)添加一个存放数据文件的文件夹到文件组(请不要预先创建好这个文件夹,用alter database add file() to filegroup)

(3)创建持久化/非持久化 的内存优化表(sql server2014默认是持久化的),同时你还必须定义一个基于非聚集哈希索引的主键哈希索引是在内存优化表中唯一支持的索引类型。

(4)使用本地编译存储过程:内存优化表支持本地编译存储过程,只要那些存储过程只引用内存优化表。

限制:

(1)内存优化表必须放在有 CONTAINS MEMORY_OPTIMIZED_DATA 文件组的数据库下。

(2)内存优化表必须定义一个基于非聚集哈希索引的主键,且该表不支持外键约束检查

(3)内存优化表必须要有足够的内存,否则插入更新等操作会失败。

【1.1】创建数据库与MEMORY_OPTIMIZED_DATA文件组

USE master;
GO
--创建测试数据库
CREATE DATABASE TestHekaton;
GO

--创建内存优化数据文件组 ALTER DATABASE TestHekaton ADD FILEGROUP HekatonFG CONTAINS MEMORY_OPTIMIZED_DATA; GO

注意ALTER DATABASE语句中的ADD FILEGROUP 语句包含文件组的名称(HekatonFG)和关键字CONTAINS MEMORY_OPTIMIZED_DATA

它会指导SQL Server去创建支持内存OLTP引擎所必需的文件组类型。

注意:每个数据库只能有一个MEMORY_OPTIMIZED_DATA文件组!!

可以通过SSMS属性查看文件组,或者  sys.database_files df join sys.filegroups 来查看文件组是否存在。

【1.2】

【2】参考文档

桦仔:

试试sql server2014内存优化表:https://www.cnblogs.com/lyhabc/p/3691911.html

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

猜你喜欢

转载自www.cnblogs.com/gered/p/12925354.html
今日推荐