SQL Server 2014 数据内存优化表详解

不同于disk-based table,内存优化表驻留在内存中,使用 Hekaton 内存数据库引擎实现。在查询时,从内存中读取数据行;在更新时,将数据的更新直接写入到内存中。内存优化表能够在disk上维护一个副本,用于持久化数据集。

Memory-optimized tables reside in memory. Rows in the table are read from and written to memory. The entire table resides in memory. A second copy of the table data is maintained on disk, but only for durability purposes.

一,创建数据库

内存优化表的必须存储在一个 包含memory-optimized-data的File Group中,一个db只能包含一个,该File Group可以有多个File(File实际上是folder)。

use master
go 

--create database
create database TestMemoryDB

--add filegroup
alter database TestMemoryDB
add filegroup FG_TestMemoryDB
contains memory_optimized_data;

--add file directory go filegroup
alter database TestMemoryDB
add file
(
name='TestMemoryDBDirectory',
filename='D:\MSSQLServerData\MSSQL12.MSSQLSERVER\MSSQL\DATA\TestMemoryDBDirectory'
)
to filegroup FG_TestMemoryDB;
CONTAINS MEMORY_OPTIMIZED_DATA 子句指定用于存储内存优化表数据的FileGroup。

Specifies that the filegroup stores memory_optimized data in the file system. Only one MEMORY_OPTIMIZED_DATA filegroup is allowed per database.

二,创建内存优化表

在SQL Server 2014 的内存优化表中,只能创建nonclustered index 或nonclustered hash index,每个内存优化表中至少创建一个index,最多创建8个index。在内存优化表中,Index必须在Create Table语句中创建,不能使用Create index 命令创建索引,也不能使用drop index 命令删除索引。

You must specify column and table indexes as part of the CREATE TABLE statement. CREATE INDEX and DROP INDEX are not supported for memory-optimized tables.

--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) collate Latin1_General_100_BIN2 not null,
    [Description] [varchar](1000) 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,Durability 持久性

DURABILITY = {SCHEMA_ONLY | SCHEMA_AND_DATA}

The value of SCHEMA_AND_DATA indicates that the table is durable, meaning that changes are persisted on disk and survive restart or failover.  SCHEMA_AND_DATA is the default value.

The value of SCHEMA_ONLY indicates that the table is non-durable. The table schema is persisted but any data updates are not persisted upon a restart or failover of the database. DURABILITY=SCHEMA_ONLY is only allowed with MEMORY_OPTIMIZED=ON.

2,MEMORY_OPTIMIZED 内存优化属性

[MEMORY_OPTIMIZED = {ON | OFF}]

The value ON indicates that the table is memory optimized. The default value OFF indicates that the table is disk-based.

3,Hash index

Hash indexes are supported only on memory-optimized tables.

BUCKET_COUNT Indicates the number of buckets that should be created in the hash index.

创建内存优化表的限制

Restriction1:不支持blob 数据类型,每行的size不能超过8060B(一个buffer的大小)

The row size limit of 8060 bytes for memory optimized tables has been exceeded. Please simplify the table definition.

Restriction2:Index key不可为null

Nullable columns in the index key are not supported with indexes on memory optimized tables.

Restriction3:在字符列上创建Index,那么字符列必须使用 BIN2 collation。

Indexes on character columns that do not use a *_BIN2 collation are not supported with indexes on memory optimized tables.

Restriction4:数据类型为(var)char 的column,其code page必须是1252

The data types char(n) and varchar(n) using a collation that has a code page other than 1252 are not supported with memory optimized tables.

三,创建natively compiled SP

本地编译SP在创建时编译,整个SP以原子方式执行,这意味着,以SP为单位,整个SP中的所有操作是一个原子操作,要么执行成功,要么执行失败。

--create 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属性,如果参数 指定 not null,那么不能给参数指定null。

NOT NULLconstraints on parameters of and variables in natively compiled stored procedures. You cannot assign NULL values to parameters or variables declared as NOT NULL .

CREATE PROCEDURE dbo.myproc (@myVarchar  varchar(32)  not null ) ...

DECLARE @myVarchar  varchar(32)  not null = "Hello" ; -- (Must initialize to a value.)

SET @myVarchar = null ; -- (Compiles, but fails during run time.)

2,本地编译的SP必须包含两个选项: SCHEMABINDING 和 ATOMIC block

SCHEMABINDING : A natively compiled stored procedure must be bound to the schema of the objects it references.

ATOMIC block:All statements in ATOMIC blocks, which are required with natively compiled stored procedures, always run as part of a single transaction - either the actions of the atomic block as a whole are committed, or they are all rolled back, in case of a failure.

The natively compiled stored procedure body must consist of exactly one atomic block. Atomic blocks guarantee atomic execution of the stored procedure. If the procedure is invoked outside the context of an active transaction, it will start a new transaction, which commits at the end of the atomic block.

Atomic blocks in natively compiled stored procedures have two required options:

TRANSACTION ISOLATION LEVEL . See Transaction Isolation Levels for Memory-Optimized Tables for supported isolation levels.

LANGUAGE. The language for the stored procedure must be set to one of the available languages or language aliases.

3,解释型SP和本地编译SP的区别是Interpreted SP在第一次执行时编译,而natively compiled SP是在创建时编译。

One difference between interpreted (disk-based) stored procedures and natively compiled stored procedures is that an interpreted stored procedure is compiled at first execution, whereas a natively compiled stored procedure is compiled when it is created. With natively compiled stored procedures, many error conditions can be detected at create time and will cause creation of the natively compiled stored procedure to fail (such as arithmetic overflow, type conversion, and some divide-by-zero conditions). With interpreted stored procedures, these error conditions typically do not cause a failure when the stored procedure is created, but all executions will fail.

4,延迟持久化

在本地编译SP中,设置 DELAYED_DURABILITY = ON ,那么SP对内存优化表的更新操作,将会延迟持久到Disk。这意味着,如果内存优化表维护了一个Disk-based 的副本,数据行在内存中修改之后,不会立即更新到Disk-based 的副本中,这有丢失数据的可能性,但是能够减少Disk IO,提高数据更新的性能。

Appendix:创建natively compiled SP的语法

-- Syntax for SQL Server Natively Compiled Stored Procedures 
 
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name 
    [ { @parameter data_type } [ NULL | NOT NULL ] [ = default ] [ OUT | OUTPUT ] [READONLY] ] [ ,... n ] 
  WITH NATIVE_COMPILATION, SCHEMABINDING [ , EXECUTE AS clause ] 
AS 

  BEGIN ATOMIC WITH (set_option [ ,... n ] ) 
sql_statement [;] [ ... n ] 
 [ END ] 

 [;] 
 
<set_option> ::= 
    LANGUAGE =  [ N ] 'language' 
  | TRANSACTION ISOLATION LEVEL =  { SNAPSHOT | REPEATABLE READ | SERIALIZABLE } 
  | [ DATEFIRST = number ] 
  | [ DATEFORMAT = format ] 
  | [ DELAYED_DURABILITY = { OFF | ON } ] 

时间: 2024-09-19 09:54:20

SQL Server 2014 数据内存优化表详解的相关文章

MSSQL-应用案例-SQL Server 2016基于内存优化表的列存储索引分析Web Access Log

问题引入 在日常的网站运维工作中,我们需要对网站客户端访问情况做统计.汇总.分析和报表展示,以数据来全面掌控网站运营和访问情况.当不可预知的意外情况发生时,我们可以快速发现问题以及采取相应的措施.比如:当网站受到黑客攻击时的流量陡增,又或者是网站某个资源发生意外抛异常等情况. 在提供Web服务的服务器上,比如IIS.Apache都存在访问日志记录,这篇是文章是以SQL Server 2016基于内存优化表的列存储索引来分析Apache Web Access Log为例,讲解分析网站访问情况,因此

SQL Server 2016 Alwayson新增功能图文详解

概述 SQLServer2016发布版本到现在已有一年多的时间了,目前最新的稳定版本是SP1版本.接下来就开看看2016在Alwyson上做了哪些改进,记得之前我在写2014Alwayson的时候提到过几个需要改进的问题在2016上已经做了改进. 一.自动故障转移副本数量 在2016之前的版本自动故障转移副本最多只能配置2个副本,在2016上变成了3个. 说明:自动故障转移增加到三个副本影响并不是很大不是非常的重要,多增加一个故障转移副本也意味着你的作业也需要多维护一个副本.重要程度(一般).

SQL Server 2005 安装图解(图文详解+全程截图)

去年暑假刚毕业的时候我去了电信实业工作,做了几个月的.NET开发,数据库用的就是SQL Server,不过是SQL Server 2000.说真的我讨厌做开发,那段经历也是我不愿去回想的,没有任何乐趣.SQL Server 2000我安装过好几次,SQL Server 2005我就安装过两次,两个版本的安装过程有很大不同.当然我在安装之前首先是参考了专家的教程.小站已经有网友跟我提过出一个SQL Server 2005安装教程.今天就分享一下安装的方法和过程,以图文的形式,一步一步详细讲解. 一

关于SQL Server 事务、异常和游标详解(1/3)

本教程来说一下关于SQL Server 事务.异常和游标的事情下面来看教程,希望对你有帮助. 1. 事务的特点         事务有若干条T-SQL指令组成,并且所有的指令昨晚一个整体提交给数据库教程系统,执行时,这组指令要么全部执行完成,要么全部取消.因此,事务是一个不可分割的逻辑单元.           事务有4个属性:原子性(Atomicity).一致性(Consistency).隔离性(Isolation)以及持久性(Durability),也称作事务的ACID属性.        

深入sql server 2005 万能分页存储过程的详解

–建立主表临时表CREATE TABLE #temp(rownumber bigint,orderseqno VARCHAR(36),goodsname VARCHAR(50),companyname VARCHAR(100)) –建立子表临 时表CREATE TABLE #detail(orderseqno VARCHAR(36),detailid UNIQUEIDENTIFIER,unitprice DECIMAL(12,2),Qty int) –插入主表数据到主表临时表insert int

深入sql server 2005 万能分页存储过程的详解_MsSql

–建立主表临时表CREATE TABLE #temp(rownumber bigint,orderseqno VARCHAR(36),goodsname VARCHAR(50),companyname VARCHAR(100))–建立子表临 时表CREATE TABLE #detail(orderseqno VARCHAR(36),detailid UNIQUEIDENTIFIER,unitprice DECIMAL(12,2),Qty int)–插入主表数据到主表临时表insert into

Navicat远程连接SQL Server并转换成MySQL步骤详解

前言 最近项目中遇到用 SQL Server的程序,以前没用过这个数据库,于是尝试将其转换为 MySQL 的格式,可是不想在本地安装 SQL Server,于是决定在一个远程的 Windows 服务器上安装,并在本地连接它,然而在实现过程中遇到了诸多问题,记录于此.方便自家或者大家在需要的时候参考借鉴,下面来一起看看吧. 环境信息 先说一下环境,服务器的系统是 Windows Server 2016 Datacenter,数据库是 SQL Server 2016 Express. 本地这面是 W

SQL Server 2005升级的十个步骤详解

server|详解 一.证明升级的必要性 找到进行SQL Server 2005升级的关键因素也许很简单,但要说服技术和业务管理人员进行实施却是个难题.调查和教育是良好的开端.要考虑目前的平台遇到过的所有问题,然后确定单单SQL Server 2005(或者连同其他额外产品)会不会解决业务和技术上的难题.把调查结果汇报给上层管理人员. 二.成本和投资回报 升级决策的一个方面免不了归结为将成本与时间跟业务改进与竞争优势进行比较.要找出升级带来的实际成本和效益很难,因为成本和效益都分为有形的和无形的

linux中512M VPS内存优化步骤详解

512M的VPS优化apache内存 查看目前占用内存 Ps aux|grep httpd 基本一个占用50M左右 ps aux|grep httpd | wc –l 一共13个,减去grep httpd 那行 12个,说明占用大约600M 超过了服务器512M内存, (相比之下nginx主进程占用50M,带着php-fpm跑,一个fpm占用2M,开启10个fpm进程,一共70M的内存就足够了.) 标准Linux Apache配置在Apache的配置文件在/etc/httpd/conf/http