SQL Server 2016中In-Memory OLTP继CTP3之后的新改进
SQL Server 2016中In-Memory OLTP继CTP3之后的新改进
转译自:https://blogs.msdn.microsoft.com/sqlserverstorageengine/2016/03/25/whats-new-for-in-memory-oltp-in-sql-server-2016-since-ctp3/
SQL Server 2016正在对 In-Memory OLTP 功能作一系列的强化,从而使该功能使用起来更加方便,性能更优。
在之前的文章中,我已经对SQL Server 2016 以及后来的CTP3版本的新增功能进行了汇总说明。
而自那时开始,我们又在原有功能的基础上增加了一些新功能,包括空索引键列、LOB类型字段和自动更新统计信息。
以下是我们为处于CTP3和RC0版本之间的In-Memory OLTP增加的新特性。
在下文的新特性列表中,您将会看到关于LOBs和其它off-row 列、表结构修改和统计信息改进方面的更详细的说明。
CTP3与RC0功能层之间新增的In-Memory OLTP新特性
Transact-SQL 改进:
1、本地模块中查询表面:
2、LOB数据类型 :现在可以使用[varchar(max), nvarchar(max)与varbinary(max)]作为输入参数与变量.
3、OUTPUT 子句:目前在本地编译存储过程中, INSERT,UPDATE 与DELETE也已包含OUTPUT 子句。
4、@@SPID:这一内置功能得到本地编译T-SQL 模块的支持,约束条件见内存优化表。
5、内存优化表支持的功能增加如下:
6、NULLable索引键列。现在允许在内存优化表的索引键中添加NULLable列。
7、Large row: 内存优化表的列可使用LOB数据类型[varchar(max), nvarchar(max与varbinary(max)]。此外,列中无LOB数据类型时,内存优化表的行大小也可超过8060字节。详细说明见下文。
8、内存优化表中的唯一索引。现在索引可指定为UNIQUE。
9、堆扫描: 查询处理程序可在内存中直接扫描堆数据结构表中的各行。需要进行全表扫描时,这种方法比全索引扫描更有效。
10、并行扫描: 所有索引类型及基本堆表现在都支持并行扫描。可以增强分析型查询扫描大型数据集的性能。
11、缩短更新所需停机时间: 从SQL Server 2016的较早版本更新至最新版本不再需要运行数据库恢复。因此,数据大小不再影响升级时间。针对SQL Server 2014升级与附加/还原,数据库需要重启一次,所以SQL2014 数据库升级所需的停机时间约为[数据库恢复所需时间].
12、日志优化与并行ALTER TABLE: 目前,大部分ALTER TABLE都是并行的,并优化写入事务日志。优化指的是只写入元数据变化。有关例外的详细讨论见下文。
统计信息的改进:
1、现在支持自动更新统计信息。不再需要手动更新统计信息。
2、现在支持统计信息采样。可以改进统计信息收集的性能。
请注意,不支持自动重新编译本地模块。需要使用sp_recompile进行手动重新编译。
LOB和其他off-row 列
内存优化表与本地编译T-SQL模块现在已经支持支持大对象(LOB)数据类型varchar(max), nvarchar(max)与varbinary(max),且大小限制跟基于磁盘的表一样(LOB数据类型数据不能超过2GB )。此外,即使表中无LOB数据类型列时,内存优化表的行大小也可超过8060字节。根据表的定义,行的大小或各行数据无运行时间限制。当然,所有数据也需要装入内存。
即使现在支持LOB类型列,但仍推荐列的大小小于8060字节来实现最佳性能。详细信息见下文。
下列T-SQL 脚本可以说明具有多个non-LOB列与单个LOB列的表:
CREATE TABLE dbo.LargeTableSample
(
Id int IDENTITY PRIMARY KEY NONCLUSTERED,
C1 nvarchar(4000),
C2 nvarchar(4000),
C3 nvarchar(4000),
C4 nvarchar(4000),
Misc nvarchar(max)
) WITH (MEMORY_OPTIMIZED = ON);
GO
LOB列和其他列等无法装入in-row的8060字节的存储在off-row,in-row只存储off-row的8字节引用。另外会有一个内部表来单独存储每个off-row列。
将列装入on-row或off-row的逻辑如下所示,每次ALTER TABLE操作都须确保遵循以下规则。
1、如果数据列超过了行大小限制的8060字节,那么最大列将被存储在off-row。例如,在一个表包含varbinary(8000)的列要加入varbinary(2000)列,那么会将原本在in-row的varbinary(8000)列将被移至off-row。
2、所有索引键列都必须存储在in-row;如果索引键列为无法存在在in-row的表,则无法添加索引。考虑之前例子中的那张表。如果在varbinary(8000)列中创建索引,那么varbinary(8000)列被移入in-row,而varbinary(2000)列被移至off-row,因为索引键列必须存储在in-row。
下列查询显示了所有的列都被存储在off-row,依据它们列的大小与内存使用情况。
SELECT object_name(moa.object_id) AD 'table', c.name AS 'column', c.max_length
FROM sys.memory_optimized_tables_internal_attributes moa
JOIN sys.columns c ON moa.object_id = c.object_id AND moa.minor_id=c.column_id
WHERE moa.type=5
使用下列查询可以了解到更多有关行off-row的内存消耗,查询显示了所有存储在内部表的off-row列和off-row索引的内存消耗:
SELECT
OBJECT_NAME(moa.object_id) AS 'table',
c.name AS 'column',
c.max_length,
mc.memory_consumer_desc,
mc.index_id,
mc.allocated_bytes,
mc.used_bytes
FROM sys.memory_optimized_tables_internal_attributes moa
JOIN sys.columns c ON moa.object_id = c.object_id AND moa.minor_id=c.column_id
JOIN sys.dm_db_xtp_memory_consumers mc ON moa.xtp_object_id=mc.xtp_object_id
WHERE moa.type=5
ALTER TABLE优化
ALTER TABLE一般用于更改架构及调优索引。详细语法与范例见有关 Altering Memory-Optimizes Tables文档。
SQL Server 2016中,内存优化表内的 ALTER TABLE操作是脱机完成的,也就是说操作过程中无法进行表的查询。所有的对内存优化表数据结构的更改和操作 包括列和索引变更都是利用创建新表并复制旧表数据来完成的。在一个10GB 的表中进行ALTER操作在采用24个逻辑处理器的服务器上并行运行,大约需要一分钟就可以完成,这一时间随着表的大小而变化。另一个好消息是现在可以在一个ALTER TABLE 语句中组合多个ADD, DROP或 ALTER操作。 例如,你现在完全可以在一个ALTER TABLE 语句中添加一个列,一条索引,还可以再添加一个约束。
大部分ALTER TABLE场景都是并行运行的,而且都经过事务日志优化,事务日志优化指的是只在事务日志中写入元数据变化。但部分ALTER TABLE操作是单线程的,而且并不能进行日志优化,也就是说将完整的表复制进事务日志中,作为ALTER TABLE事务的一部分。
下面列举的ALTER 操作都是单线程的,而且不能进行日志优化:
1、ADD/ALTER一个使用大对象(LOB)数据类型的列:nvarchar(max), varchar(max)或varbinary(max)。
2、ADD/DROP 一个COLUMNSTORE列存储索引。.
3、ADD/ALTER一个off-row列,那么ADD/ALTER/DROP操作会引起in-row列移至off-row,或off-row列移至in-row。
注意: 使用ALTER语句增加一个off-row列的长度是可以进行日志优化的。
统计信息的改进
现在对内存优化表的统计信息已经可以自动更新,并支持统计信息采样。正因为有了这个该井,内存优化表的统计信息管理方式和基于磁盘表的统计信息管理方式是一样的,而且也有一样的权衡。
1、是否需要更新统计信息的逻辑跟磁盘表的逻辑是一样的,但有一个例外:磁盘表的modify计数器mod-counter是在每个数据列里的,而内存优化表的mod-counter是在行级别的。Modify计数器通常用于跟踪表里面有多少数据发生了变化,一旦达到阀值自动更新统计信息功能就会启动。TF2453和(RECOMPILE重新编译)选项在表变量里得到支持。
2、支持AUTO_UPDATE_STATISTICS_ASYNC。
3、统计信息采样率跟基于硬盘的表一样,而且支持并行采样。
4、针对大部分统计信息改进,请确保数据库选项设置兼容级别为 130。
5、为了自动更新已存在的统计信息,需进行一次手动更新(见下面脚本)。
6、手动重新编译本地编译模块。使用sp_recompile重新编译本地编译模块。
统计信息的一次性脚本: 您可以运行一次下面的Transact-SQL脚本以更新所有内存优化表的统计信息,然后启用统计信息的自动更新(假设数据库已经开启AUTO_UPDATE_STATISTICS)。
-- Assuming AUTO_UPDATE_STATISTICS is already ON for your database:
-- ALTER DATABASE CURRENT SET AUTO_UPDATE_STATISTICS ON;
GO
ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130;
GO
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT
@sql += N'UPDATE STATISTICS '
+ quotename(schema_name(t.schema_id))
+ N'.'
+ quotename(t.name)
+ ';' + CHAR(13) + CHAR(10)
FROM sys.tables AS t
WHERE t.is_memory_optimized = 1
;
EXECUTE sp_executesql @sql;
GO
-- Each row appended to @sql looks roughly like:
-- UPDATE STATISTICS [dbo].[MyMemoryOptimizedTable];
以上就是SQL Server 2016中In-Memory OLTP的新改进
本文版权归作者所有,未经作者同意不得转载。
SQL Server 2016中In-Memory OLTP继CTP3之后的新改进的更多相关文章
- SQL Server 2016五大优势挖掘企业用户数据价值
SQL Server 2016五大优势挖掘企业用户数据价值 转载自:http://soft.zdnet.com.cn/software_zone/2016/0318/3074442.shtml 3月1 ...
- SQL Server 2016原生支持JSON
转载原地址: http://www.cnblogs.com/lyhabc/p/4747694.html SQL Server 2005 开始支持 XML 数据类型,提供原生的 XML数据类型.XML ...
- 数据库技术丛书:SQL Server 2016 从入门到实战(视频教学版) PDF
1:书籍下载方式: SQL Server2016从入门到实战 PDF 下载 链接:https://pan.baidu.com/s/1sWZjdud4RosPyg8sUBaqsQ 密码:8z7w 学习 ...
- 翻译1-在SQL Server 2016中介绍微软R服务
在SQL Server 2016中介绍微软R服务 源自:http://www.sqlservercentral.com/articles/Microsoft/145393/ 作者:tomakatrun ...
- SQL Server系列之SQL Server 2016 中文企业版详细安装步骤(超多图)
1. 下载地址 下载地址 :https://www.microsoft.com/en-us/server-cloud/products/sql-server-2016/ 官方技术文档:https:// ...
- SQL Server 2016最值得关注的10大新特性
全程加密技术(Always Encrypted) 全程加密技术(Always Encrypted)支持在SQL Server中保持数据加密,只有调用SQL Server的应用才能访问加密数据.该功能支 ...
- SQL Server 2016 ->> T-SQL新特性
1) TRUNCATE表分区而不是整表 CREATE TABLE dbo.TruncatePartitionTest ( PrtCol INT, Col2 ) ) ON [myPS1](PrtCol) ...
- SQL Server 2016 —— 聚集列存储索引的功能增强
作者 Jonathan Allen,译者 邵思华 发布于 2015年6月14日 聚集列存储索引(CC Index)是SQL Server 2014中两大最引 ...
- SQL Server 内存中OLTP内部机制概述(一)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
随机推荐
- AJAX的核心XMLHttpRequest对象
为了实现异步通讯,提高用户体验度,而将很多旧知识(XML,DOM,JavaScript,HTML,jQuery,Css...)重新融合程一个新的知识框架.而XMLHttpRequest对象则是其中的重 ...
- display:table-cell的应用
一.display:table-cell属性简述 display:table-cell属性指让标签元素以表格单元格的形式呈现,类似于td标签.目前IE8+以及其他现代浏览器都是支持此属性的,但是IE6 ...
- CSS3简单的栅格系统
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- c#程序中对密码进行加密的方法
在ADO.NET中,向数据库添加数据时,怎样对数据中的密码进行加密?(也就是说在数据表中也看不到用户的密 码,只是一些经过编译后的字符串,以防止数据库管理员利用用户的密码进行非法操作.) 首先, ...
- ChannelHandler
ChannelHandler功能介绍 ChannelHandler类似于Servlet的Filter过滤器,负责对I/O事件或者I/O操作进行拦截和处理,它可以选择性地拦截和处理自己感兴趣的事件,也可 ...
- IDA的脚本IDC的一个简单使用
目的:主要是想学习一下IDA的IDC的脚本的使用.这里做了一个小的测试. 这里使用的是VS2015Community来生成文件的. 一.编写测试程序: 这里先生成我们的目标数据. 然后编写测试程序.得 ...
- LINUX 常用命令 ps 详解
ps常用命令 ps -u ceshi 查看特定用户(ceshi)进程的情况 ps aux | grep nginx 查找nginx的进程 pa -ef | grep nginx 查找nginx的进程 ...
- LeetCode 344. Reverse String
Problem: Write a function that takes a string as input and returns the string reversed. Example: Giv ...
- 2016-1-29 图解HTTP(04)
第7章 确保Web安全的HTTPS 在HTTP协议中有可能存在信息窃听或身份伪装等安全问题.使用HTTPS通信机制可以有效的防止这些问题. 7.1 HTTP的缺点 ● 通信使用明文(不加密),内容可能 ...
- Shell 快捷键
输入bind -P可以查看所有的键盘绑定 Ctrl + Shift + '-' 缩小shell框Ctrl + Shift + ‘+' 放大shell框 CTRL相关的快捷键Ctrl-A 相当于HOME ...