时间:2021-07-01 10:21:17 帮助过:11人阅读
step2,为数据库创建一个包含内存优化数据的FileGroup,向该FileGroup中添加“File”,实际上是目录(Directory),用于存储内存优化数据文件,主要是CheckPoint文件,用于还原持久化的内存优化表。
-- Add File Group from memory-optimized data alter database [Test_MemboryDB] add filegroup fg_MemoryOptimizedData contains MEMORY_OPTIMIZED_DATA; alter database [Test_MemboryDB] add file ( name=Test_MemboryDBDirectory, filename=‘D:\Program Files\Microsoft SQL Server\Test_MemboryDBDirectory‘ ) to FILEGROUP fg_MemoryOptimizedData;
文件组属性:CONTAINS MEMORY_OPTIMIZED_DATA 子句,指定File Group用于存储内存优化表数据,每个数据库只能指定一个存储内存优化数据的File Group,可以在该File Group下创建多个Directory,分布在不同的物理Disk上,加快内存优化表数据还原的速度。
二,创建内存优化表
内存优化表用于存储用户数据,可以持久化存储,数据存储在内存中,同时,在Disk上维护数据的一个副本,通过选项 DURABILITY= SCHEMA_AND_DATA 指定持久化存储内存优化表;也可以只存储在内存中,通过选项DURABILITY= SCHEMA_ONLY指定。在内存优化表上,可以创建nonclustered index 或nonclustered hash index,每个内存优化表中至少创建一个Index。
--create memory optimized table create table [dbo].[products] ( [ProductID] [bigint] not null, [Name] [varchar](64) not null, [Price] decimal(10,2) not null, [Unit] varchar(16) not null, [Description] [varchar](max) null, constraint [PK__Products_ProductID] primary key nonclustered hash ([ProductID])with (bucket_count=2000000) ,index idx_Products_Price nonclustered([Price] desc) ,index idx_Products_Unit nonclustered hash(Unit) with(bucket_count=40000) ) with(memory_optimized=on,durability= schema_and_data) go
1,内存优化:MEMORY_OPTIMIZED
[MEMORY_OPTIMIZED = {ON | OFF}]
默认值是OFF,指定创建的表是硬盘表;设置选项MEMORY_OPTIMIZED为ON,指定创建的表是内存优化表;
2,持久性:Durability
DURABILITY = {SCHEMA_ONLY | SCHEMA_AND_DATA}
默认值是SCHEMA_AND_DATA,指定创建的内存优化表是持久化的,这意味着,数据更新会持久化存储到Disk上,在SQL Server重启之后,内存优化表的数据能跟根据存储在Disk上的副本还原。选项 SCHEMA_ONLY 指定创建的内存优化表是非持久化的,这意味着Table Schema是持久化存储到Disk上,但是,任何数据更新都不会持久化到Disk上,在SQL Server重启之后,内存优化表的数据会丢失。
3,哈希索引和范围索引
内存优化表支持Hash Index,属性 BUCKET_COUNT 指定为Hash Index创建的bucket的数量,一般hash bucket的数量是数据行的1-2倍,如果无法估计bucket的数量,请创建范围索引(NonClustered Index),索引结构是Bw-Tree。
Hash 索引由一个数组和多个数据行链组成,每一个数组元素叫做一个Hash Bucket,通过内置的Hash函数,将Hash索引的Key映射到Hash Bucket上,例如,如果Hash Index的Key是(Col1,Col2),根据HashFunction(Col1,Col2)返回的Hash Value,将数据行映射到指定的Hash Bucket上;如果多个Key映射到同一个Hash Bucket上,那么这些Key组成一个链。例如:数据表结构是(Name,City),在Name字段上创建Hash Index,Hash值相同的数据行链接成一个单向链。
三,创建Natively Compiled SP
本地编译SP在创建时编译成机器代码,整个SP以原子方式执行,这意味着,以SP为单位,整个SP中的所有操作是一个原子操作,要么执行成功,要么执行失败。
create procedure dbo.usp_GetProduct @ProductID bigint not null with native_compilation, schemabinding, execute as owner as begin atomic with (transaction isolation level = snapshot, language = N‘US_English‘) select [ProductID] ,[Name] ,[Price] ,[Unit] ,[Description] from [dbo].[Products] where ProductID=@ProductID end go
1,在本地编译SP中,能够为参数,变量指定Nullability属性,默认值是NULL
NOT NULL 属性:不能为参数或变量指定NULL值,
2,本地编译SP必须包含两个选项:SCHEMABINDING 和 ATOMIC Block
使用Atomic Block必须设置两个选项:
3,解释型SP和本地编译SP的区别
解释性SP能够访问硬盘表(Disk-Based Table)和内存优化表(Memory-Optimized Table),其真正的区别是解释性(Interpreted)SP在第一次执行时编译,而本地编译(Natively Compiled)SP是在创建时编译,并且直接编译成机器代码,绑定的是内存地址。
4,延迟持久化
在本地编译SP中,设置Atoic Block的选项:DELAYED_DURABILITY = ON ,使SP对内存优化表的更新操作,以异步写事务日志方式,延迟持久化到Disk,这意味着,如果内存优化表维护了一个Disk-Based 的副本,数据在内存中修改之后,不会立即更新到Disk-Based 的副本中,这有丢失数据的可能性,但是能够减少Disk IO,提高数据更新的性能。
四,使用内存优化的表变量和临时表
传统的表变量和临时表,都使用tempdb存储临时数据,而tempdb不是内存数据库,使用Disk存储临时表和表变量的数据,会产生Disk IO和竞争,SQL Server提供了内存优化的表变量,将临时数据存储在内存中,详细信息,请参考我的博客:《In-Memory:在内存中创建临时表和表变量》。
五,在内存数据库中使用JSON
自从使用JSON之后,我的第一感概是:数据库岂能没有JSON,不管是数据库将值传递前端,还是前端将数据传递到数据库,使用JSON方便很多,相比XML,JSON的使用简单很多,详细信息,请参考我的博客:《使用TSQL查询和更新 JSON 数据》
六,内存数据库的事务处理
交叉事务是指在一个事务中,解释性TSQL语句同时访问内存优化表(Memory-Optimized Table,简称MOT)和硬盘表(Disk-Based Table,简称DBT)。在交叉事务中,访问MOT的操作和访问DBT的操作都拥有自己独立的事务序号,就像在一个大的交叉事务下,存在两个单独的子事务,分别用于访问MOT和DBT;
In-Memory:内存数据库
标签:gif 整合 ima binding 最好 mit 执行 bin copy