1.5 创建分区

1.5  创建分区


1.5.1  分区

  在早期的数据库引擎中,尽管一个文件组可以包含多个文件,但是表和索引等对象被限制在单个文件组中。

  SQL Server 2005 引入了表分区(Table Partitioning)功能。已分区表和已分区索引可以将数据水平划分并且分散储存到数据库的多个文件组的单元中,也就是说,可以指定将对象的数据按照一定的规则拆分为多个部分,存储到多个文件组中。

wKiom1X5KGWCFdmoAAFLX-luRGY942.jpg


  只有企业版支持表分区功能。



1.5.2  创建分区

对表和索引进行分区需要经过三个步骤。

(1)创建分区函数

  分区函数(Partition Function)定义了一个或多个边界位置,数据将根据这些边界进行分区。

  用于设置边界的数据类型可是大部分的 SQL Server 原生的数据类型,但不包括 text、ntext、image、varbinary(max)、timestamp、xml、varchar(max),以及不可以使用用户自定义数据类型,也不能使用CLR数据类型。如果是 real (或非精确数据类型的计算列),则必须持久化(PERSISTED)。

  必须指定边界位置属于哪个分区。如果使用  RANGE LEFT,则边界点包含在左边的分区;如果使用 RANGE RIGHT,则边界点包含在右边的分区。

  SQL Server 2005 最多允许一个对象拥有 1000 个分区,因此最多可以指定 999 个边界点。SQL Server 2012 支持多达 15000 个分区。 

  下例的脚本创建了一个分区函数,将 DATETIME 数据类型的数据划分为3个分区。

USE SQLDB01

GO

CREATE PARTITION FUNCTION PartFunc(DATETIME) AS

RANGE RIGHT FOR VALUES('2013-1-1', '2014-1-1')

GO


  可以通过 sys.partition_range_values 系统视图查看当前数据库的所有分区函数。

SELECT * FROM sys.partition_range_values


提示:

  分区函数的定义没有绑定给某个数据库对象,因此分区函数可以应用于多个表或索引。

  如果分区函数中的任何行具有带 Null 值的分区列,默认情况下,会将这些行分配到最左侧分区。 但是,如果将 NULL 指定为边界值并指示 RIGHT,则最左侧的分区仍为空,所以 NULL 值位于第二个分区。


(2)创建分区方案

  分区方案(Partition Scheme)用于将分区映射到文件组。

  每个分区都必须映射到一个文件件。例如,在分区函数中指定了2个边界点,则必须在分区方案中至少定义3个文件组。如果分区方案包含的文件组多于分区数,那么多余的文件组不会被用于储存数据。

USE SQLDB01

GO

CREATE PARTITION SCHEME PartScheme AS

PARTITION PartFunc TO

(FG2012, FG2013, FG2014)

GO


  可以通过 sys.partition_schemes 系统视图查看当前数据库的所有分区方案。

SELECT * FROM sys.partition_schemes 


  可以通过一个内置的 $PARTITION 函数查询某个数值或表达式位于第几个分区。

SELECT $PARTITION.PartFunc ('2014-2-14') AS PartitionNumber


提示:

  分区函数和分区方案仅在创建它们的数据库内有效,不能被其他数据库使用。即使在该数据库内,分区函数处于一个单独的命名空间内,不会与其他函数的名称发生冲突。


(3)创建表或索引

  最后一步是通过一个分区列,在一个分区方案上创建表或索引。

  指定的分区键必须匹配分区函数的数据类型、长度和精度。如果分区键是一个计算列,则计算列必须持久化。

CREATE TABLE Orders

  (OrderNum     INT,

   CustomerNum   INT     NOT NULL,

   OrderDate     DATETIME     NOT NULL)

ON PartScheme(OrderDate)



1.5.3  确认已分区表

  打开已分区表的属性窗口,选择“存储”选项卡。在“文件组”节点显示已对表进行分区,在“分区”节点则详细列出了分区方案、分区数量和用于分区的列。

wKioL1XWneXBgg0tAAJeBmPE1a4553.jpg


  可以通过 $PARTITION 函数查看已分区表在各个分区中的记录数。

SELECT $PARTITION.PartFunc(OrderDate) AS PartitionNumber,COUNT(*) AS TotalRows

FROM Orders

GROUP BY $PARTITION.PartFunc(OrderDate) 

ORDER BY PartitionNumber



1.5.4  分区的优势

  分区可以使大型表和索引更易于管理并且更灵活。

  通过对大型表或索引进行分区,可以具有以下可管理性和性能优点。

(1)可以快速、高效地传输或访问数据的子集,同时又能维护数据收集的完整性。 例如,将数据从 OLTP 加载到 OLAP 系统之类的操作仅需几秒钟即可完成,而如果不对数据进行分区,执行此操作需要几分钟或几小时。

(2)可以更快地对一个或多个分区执行维护操作。 这些操作的效率更高,因为它们仅针对这些数据子集,而非整个表。 例如,您可以选择在一个或多个分区中压缩数据,或者重新生成索引的一个或多个分区。

(3)可以根据经常执行的查询类型和硬件配置,提高查询性能。 例如,在两个或更多的已分区表中的分区列相同时,查询优化器可以更快地处理这些表之间的同等联接查询,因为可以联接这些分区本身。

  当 SQL Server 针对 I/O 操作执行数据排序时,它会首先按分区对数据进行排序。 SQL Server 每次访问一个驱动器,这样可能会降低性能。 为了提高数据排序性能,可以通过设置 RAID 将多个磁盘中的分区数据文件条带化。 这样一来,尽管 SQL Server 仍按分区对数据进行排序,但它可以同时访问每个分区的所有驱动器。

  此外,可以通过对在分区级别而不是整个表启用锁升级来提高性能。 这可以减少表上的锁争用。 




本文出自 “SQL Server 管理员指南” 博客,谢绝转载!

你可能感兴趣的:(sql,分区)