SQL Server 2014新特性:扩展缓冲池与列索引

日期: 2013-10-13 作者:Robert Shelton翻译:Ranma 来源:TechTarget中国 英文

编者按:本系列文章将详细介绍即将发布的SQL Server 2014中包含的重要特性。本文是第一篇,将着重关注SQL Server 2014中的扩展缓冲池和集群列索引两方面。 微软已经发布了SQL Server 2014的第一版公共社区技术预览版(CTP)。不出意外的话,CTP所引入的许多新特性将会在最终产品上加以呈现。

你可以从TechNet Evaluation Center(http://technet.microsoft.com/en-US/evalcenter/dn205290)下载并在你自己的系统上运行,亲自测试一些SQL Server 2014的新特性。 SQL Server 20……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

编者按:本系列文章将详细介绍即将发布的SQL Server 2014中包含的重要特性。本文是第一篇,将着重关注SQL Server 2014中的扩展缓冲池和集群列索引两方面。

微软已经发布了SQL Server 2014的第一版公共社区技术预览版(CTP)。不出意外的话,CTP所引入的许多新特性将会在最终产品上加以呈现。你可以从TechNet Evaluation Center(http://technet.microsoft.com/en-US/evalcenter/dn205290)下载并在你自己的系统上运行,亲自测试一些SQL Server 2014的新特性。

SQL Server 2014中的扩展缓冲池

缓存在存储数据页和降低I/O方面扮演着重要的角色。在SQL Server 2014中,你可以将缓冲池扩展到更高级的存储驱动器上,例如SSD或SSD阵列。SQL Server只把干净页写入缓冲扩展以将数据丢失风险最小化。通过扩展缓冲池,你可以使OLTP或OLTP工作负载,尤其是读密集型操作实现性能提升。

实现一个缓存扩展就是在服务器级为一个SQL Server 实例简单地更改下BUFFER POOLEXTENSION 设置。但在此之前,需要通过如下查询来验证此设置的当前配置:

SELECT * FROM sys.dm_os_buffer_pool_extension_configuration

以上语句会返回一条提供有当前设置详细信息的记录。此记录包含state_description 字段,它会显示缓冲池的当前状态。默认情况下,缓冲池扩展是禁用的,所以此状态会读取为BUFFER POOLEXTENSION DISABLED

你可以通过执行一条ALTER SERVER CONFIGURATION 语句轻松更改设置,它可以将BUFFER POOL EXTENSION 设置为ON,正如下面的T-SQL语句所示:

ALTER SERVER CONFIGURATION

SET BUFFER POOL EXTENSION ON

(FILENAME='C:BufferPoolcache.bpe', SIZE = 5 GB);

当更改设置为ON时,必须为缓存文件提供一个路径和文件名。此文件要求.bpe的扩展名。另外,必须指定缓存大小。在上面的例子中,我使用了本地磁盘的文件夹和文件,但是在实践中可能会指定一个SSD或SSD阵列。

当执行该语句,SQL Server就会在目标位置创建缓存文件。图1显示了在我本地磁盘上的文件cache.bpe。

图1:指定一个缓存文件到服务器作为你的缓冲池扩展

这就是扩展缓冲池所需要做的全部工作。可以通过再次查询sys.dm_os_buffer_pool_extension_configuration 动态管理视图来验证设置。这次,state_description字段的值将会显示为BUFFER POOL EXTENSION CLEANPAGE CACHING ENABLED。此视图也会返回缓存文件的详细信息。

如果你想要禁用缓冲池扩展,你只需再次执行ALTER SERVERCONFIGURATION 语句,只是这次会把设置改为OFF:

ALTER SERVER CONFIGURATION

SET BUFFER POOL EXTENSION OFF;

在执行此语句之后,SQL Server将会移除缓存文件并且此缓冲池将不再是扩展的。

在SQL Server 2014中实现集群列存储索引

微软在SQL Server 2012中引入了列存储索引。与典型B-tree索引不同,列存储索引使用列式并利用xVelocity的内存管理功能和高级压缩算法。它非常适合高聚合数据仓库查询。但是,SQL Server 2012仅支持非集群的列存储索引,它无法进行更新,只能删除并重建。

SQL Server 2014增加了一个新的索引类型:即集群列存储索引,它可以在不删除索引的情况下进行更新。你可以像创建其他任何类型的索引一样轻易创建一个集群列存储索引。例如,假定我们使用如下SELECT…INTO 语句来添加ResellerSales 表到 AdventureWorksDW2012 数据库:

USE AdventureWorksDW2012;

GO

SELECT *

INTO ResellerSales

FROM FactResellerSales;

在我的系统上,此语句会插入60855条记录到新表中。现在我们可以通过使用如下的T-SQL语句在那个表上创建一个集群列存储索引:

CREATE CLUSTERED COLUMNSTORE INDEX csi_clustered

ON ResellerSales;

正如你所看到的,我们指定了 CREATE CLUSTERED COLUMNSTORE INDEX 关键词和索引名(csi_clustered),然后以一条ON 语句来指出目标表。在执行此语句之后,我们可以通过SSMS中的Object Explorer 进行查看来轻松验证此索引是否已经得到创建。如下图2所示:

图2:SQL Server 2014现在支持集群列存储索引

虽然集群列存储索引很容易实现,但在对它进行定义的时候必须要遵守其一些限制。例如,表不能包含非集群索引,唯一性约束,主键约束和外键约束。并且,只能有一个集群索引。然而,可以通过使用一个简单的CREATECLUSTERED COLUMNSTORE INDEX 语句将一个有普通集群索引的表转换为有集群列存储索引的表。如下例所示:

DROP INDEX ResellerSales.csi_clustered;

CREATE CLUSTERED INDEX ix_clustered

ON ResellerSales (SalesOrderNumber, SalesOrderLineNumber);

CREATE CLUSTERED COLUMNSTORE INDEX ix_clustered

ON ResellerSales

WITH (DROP_EXISTING = ON);

在准备环境时,首先要使用DROP INDEX 语句移除我们在前例中创建的集群列存储索引。接下来,我们定义一条CREATECLUSTERED INDEX 语句来在SalesOrderNumber SalesOrderLineNumber 字段上建立一个普通集群索引。

在建立好环境后,我们使用一条CREATE CLUSTERED COLUMNSTORE INDEX语句来删除此普通集群索引并创建新的列存储集群索引。在那条语句中,在ON 语句中指定了目标表之后,我们包含进一条WITH 语句以将DROP_EXISTING 选项设置为ON。因此,这个存在的集群索引将会被删除并且新的集群列存储索引会被创建。注意,我们的CREATECLUSTERED COLUMNSTORE INDEX 语句必须使用与原始集群索引相同的索引名。

现在让我们来看看重建集群列存储索引。正如前面所提到的,SQL Server 2014可以不用删除和重创建来重建集群列存储索引。一个方法是使用我们在前例中所使用的相同的CREATE CLUSTERED COLUMNSTORE INDEX 语句。即使它是个CREATE 类型的语句,SQL Server也知道是要重建索引。

另外一个重建索引的选择是使用 ALTER INDEX 语句,如下例所示:

ALTER INDEX ix_clustered

ON ResellerSales

REBUILD;

我们指定适当的索引名和表名,但也包含了REBUILD 语句。

你是否使用CREATE CLUSTERED COLUMNSTORE INDEX 语句或ALTER INDEX语句来重建你的索引,SQL Server会在你没有专门删除和重新创建它的情况下对其进行更新。事实上,我们可以测试这是如何工作的。首先,我们使用如下sys.column_store_row_groups 目录视图来检查集群索引的状态:

SELECT * FROM sys.column_store_row_groups

WHERE object_id = OBJECT_ID('ResellerSales');

图3显示了此语句的返回结果。注意到state_description 字段显示状态为COMPRESSED,并有一个total_rows值为60855。这正是我们所期望的。所有记录都有解释和压缩,它表明此索引是最新的。(一个记录群组是一个索引片段。SQL Server将一个列存储索引分为一个或多个记录群组。)

图3:一个列存储记录群组在索引最新时显示为压缩状态。

下面,我们将向表中添加更多记录。以下INSERT 语句插入另外60855条记录到ResellerSales 表:

INSERT INTO ResellerSales

SELECT *

FROM FactResellerSales;

现在我们再次查询sys.column_store_row_groups 视图。这次,我们的结果包含两条记录,如图4所示。注意到列出的首条记录显示state_description 值为OPEN并且total_rows值为69855,但是我们的原始记录保持不变。换句话说就是,我们已经添加了额外数据到表中,但是这些数据还没有反映在我们的列存储索引中。

图4:如果索引不是最新,一个列存储记录群组将会显示为开放状态。

下一步就是要重建索引,这样新数据就会正确进行注册:

ALTER INDEX ix_clustered

ON ResellerSales

REBUILD;

正如我们前面所看到的一样,ALTER INDEX 语句必须包含REBUILD 以更新索引。如果现在查询sys.column_store_row_groups 目录视图,所得到的结果会再次仅包含一条记录,它会显示state_description 值为COMPRESSED 以及total_rows 值为121710

翻译

Ranma
Ranma

相关推荐