您的位置: 网界网 > 软件 > 正文

SQL Server 2014新特性:分区索引和内存优化表

2013年10月23日 20:34:23 | 作者:佚名 | 来源:TechTarget中国 | 查看本文手机版

摘要:本系列文章将详细介绍即将发布的SQL Server 2014中包含的重要特性。本文是第二篇,着重关注更新分区索引和内存优化表两个方面。

标签
SQL
内存优化
分区索引

创建内存优化

SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度。现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技术来支持大规模OLTP工作负载。尽管如此,要利用此新功能,数据库必须包含“内存优化”文件群组和表;即所配置的文件群组和表使用Hekaton技术。幸运的是,SQL Server 2014使这一过程变得非常简单直接。

要说明其工作原理,我们来创建一个名为TestHekaton的数据库,然后添加一个内存优化文件群组到此数据库,如下例中的T-SQL代码所示:

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引擎所必需的文件群组类型。要确认此文件群组已经创建,可以访问SSMS中数据库属性的Filegroups 界面,如下图4中所示。

图4:数据库属性中显示新的内存优化文件群组

下一步是添加一个文件到文件群组,可以通过执行第二个ALTER DATABASE语句来实现。下例是添加一个新文件到HekatonFG文件群组:

ALTER DATABASE TestHekaton

ADD FILE

(

NAME = 'HekatonFile',

FILENAME =

'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLSRV2014CTP1\MSSQL\DATA\HekatonFile'

)

TO FILEGROUP [HekatonFG];

GO

注意,在ADD FILE 语句中,我们只为文件路径和文件名提供了一个友好的名称。并且,在TOFILEGROUP 语句中,为新文件群组指定名称。然后可以去往数据库属性的 Files 界面来查看刚刚添加的文件,如图5中所示。

图5:数据库属性包含关于文件添加到文件群组的详细信息。

值得注意的是,可以使用数据库属性界面来直接添加文件群组和文件。这一切都取决于你偏向使用哪种方式。而使用脚本的好处在于可以保存并重新执行。

在为数据库设置了必需的文件群组和文件之后,就可以创建自己的内存优化表了。当在定义表的时候,会指定其“持久性”。一个内存优化表可以是持久的或非持久的。一个持久表是将数据存储在内存中,而且也保存在内存优化文件群组中。对于一个非持久表,数据是仅存储在内存中的,所以,如果系统崩溃或重启,数据就会丢失。在SQL Server 2014中默认用的是持久表,接下来我们来深入了解一下。

当定义一个持久内存优化表的时候,你还必须定义一个基于非集群哈希索引的主键。在一个哈希索引中,数据是通过一个内存散列表进行访问的(+微信关注网络世界),而非固定大小页。哈希索引是在内存优化表中唯一支持的索引类型。

除了在表定义中定义主键外,还必须将表配置为内存优化的,如下CREATE TABLE 语句所示:

USE TestHekaton;

GO

CREATE TABLE Reseller

(

ResellerID INT NOT NULL

PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 1024),

ResellerName NVARCHAR(50) NOT NULL,

ResellerType NVARCHAR(20) NOT NULL

) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);

INSERT INTO Reseller

VALUES (1, 'A Bike Store', 'Value Added Reseller');

ResellerID 字段定义包含了定义为非集群哈希的主键。注意,必须包含一个WITH 语句来指定BUCKET_COUNT 的设置,它表明了在哈希索引中应该创建的bucket数量。(每个bucket是一个槽,可以用来存放一组键值对。)微软建议bucket的数量应是一到两倍于你所期望的表所要包含的唯一索引键的数量。

此表定义以第二个WITH 语句结束。这里你指定MEMORY_OPTIMIZED 选项为ON 以及DURABILITY 选项为SCHEMA_AND_DATA,此选项是针对持久表的。接着在表中插入一条记录,这样就可以进行尝试了。

这就是创建一个内存优化表的全部步骤,其他的一切都会发生在幕后。但是,要记住,SQL Server 2014对这些表有着很多限制。例如,它们不支持外键或约束检查,它们也不支持IDENTITY 字段或DML触发器。最为重要的是,内存耗尽会导致写活动停止。

另一方面,内存优化表支持本地编译存储过程,只要那些存储过程只引用内存优化表。在这种情况下,存储过程可以转化为本地代码,这样会执行更快且要比典型存储过程需要更少的内存。

除了只引用内存优化表,一个本地编译存储过程必须是模式绑定的并运行在一个特定执行内容内。另外,每个本地编译存储过程必须完全由一个原子块组成。

下面的CREATE PROCEDURE 语句定义了一个本地编译存储过程,它从前例中所创建的Reseller表中检索数据:

CREATE PROCEDURE GetResellerType

(

@id INT

)

WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER

AS

BEGIN

ATOMIC WITH

(TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = 'us_english')

SELECT ResellerName, ResellerType

FROM dbo.Reseller

WHERE ResellerID = @id

END;

GO

在定义了参数之后,包含一个WITH 语句来指定NATIVE_COMPILATION 选项。注意,此语句还包含SCHEMABINDING 选项和EXECUTE AS 选项,以及指定了OWNER 作为执行环境。而WITH 语句负责实现本地编译存储过程的三大需求。

要解决原子块需求,可以在BEGIN 关键字后指定ATOMIC ,之后是另一个包含有事务隔离级别和语言的WITH 语句。对于访问内存优化表的事务,可以使用SNAPSHOT,REPEATABLEREAD 或SERIALIZABLE 作为隔离级。而且,对于此语言必须使用一个可用的语言或语言别名。

这是在定义存储过程时所需要包含的全部内容。一旦创建,就可以通过执行EXECUTE 语句来对其加以测试,如下例中所示:

EXEC GetResellerType 1;

此语句会返回经销商的姓名和类型,在本例中分别是ABike Store和Value Added Reseller。

1 2
[责任编辑:软件频道 yu_xiang@cnw.com.cn]