一、SQL Server分区介绍
在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区;也就是说表或索引至少包含一个分区。
SQL Server中数据是按水平方式分区,是多行数据映射到单个分区。已经分区的表或者索引,在执行查询或者更新时,将被看作为单个逻辑实体;
简单说来利用分区将一个表数据分多个表来存储,对于大数据量的表,将表分成多块查询,若只查询某个分区数据将降低消耗提高效率。需要注意的是单个索引或者表的分区必须位于一个数据库中。
在使用大量数据管理时,SQL Server使用分区可以快速访问数据子集,减少io提高效率。
同时不同分区可以存放在不同文件组里,文件组若能存放在不同逻辑磁盘上,则可以实现io的并发使用以提高效率。如下图所示:
二、SQL Server分区创建
虽然分区有很多好处,却不能随意使用;且不说分区管理的繁琐,只是跨分区带来的负面影响就需要我们好好分析是否有必要使用分区。
一般分区创建的业务特点:用于统计、历史数据少使用、数据自增长、可能数据冗余大、数据量庞大插入量大。
在确定是否合适使用分区前,需了解分区是如何创建的,分区的创建包括:
1、新建分区函数
2、新建文件和文件组
3、新建分区架构
4、新建分区表或者分区索引
如下图所示:分区函数定义了分区的具体方式,分区架构使用分区函数和文件组,确定分区方案,表或索引就使用分区架构来实现分区。
他们之间是使用关系,一对多的关系。
1、创建分区函数
分区函数定义如何根据某些列的值将表或索引的行映射到指定分区。分区函数制定了分区的方式。
用作索引列时有效的所有数据类型都可以用作分区依据列,timestamp 除外。无法指定 ntext、text、image、xml、varchar(max)、nvarchar(max) 或 varbinary(max) 数据类型为分区依据列。基本语法如下所示:
CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type ) AS RANGE [ LEFT | RIGHT ] FOR VALUES ( [ boundary_value [ ,...n ] ] ) [ ; ]
1.1 左/右界限RANGE [ LEFT | RIGHT ]
指定左右既是为了确定边界值处于左侧还是右侧。如下图所示RANGE RIGHT,则界限值属于右边。
/*新建分区函数*/ USE [PartionTest]; CREATE PARTITION FUNCTION [pf_PartionTest01] (datetime) AS RANGE right FOR VALUES (‘2014-12-09‘, ‘2014-12-10‘ /*分区函数查询*/ SELECT pf.name 分区函数名称 ,CASE WHEN boundary_value_on_right=1 THEN ‘RIGHT‘ ELSE ‘LEFT‘ END 分区界限方式 ,value 分区界限值 FROM sys.partition_functions pf LEFT JOIN sys.partition_range_values prv ON prv.function_id = pf.function_id ORDER BY boundary_id 查询结果如下:
注意:
1、业务上多数为使用Range Right ,将边界保留在最新分区,毕竟右为后期增长的数据;
比如按每天分区的逻辑是将当天的数据存在当天的分区内,假如当天分区为2014-12-08 00:00.000, Range Right 将2014-12-08 00:00.000的数据归于2014-12-08当天,RANGE LEFT则只能将此界限时间归于2014-12-07。与逻辑存在一定差异。
2、既然有分区界限问题,在合并分区的时候,指定分区是向左还是向右合并?
2、创建分区架构
分区架构把分区函数指定的分区映射到文件组;
CREATE PARTITION SCHEME partition_scheme_name AS PARTITION partition_function_name [ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )[ ; ]
分区指定文件组要比分区划分边界多一个,分区架构指定了具体分区数据存放在哪个文件组上。如下图所示:
在创建分区架构之前若有必要需要创建特定的文件和文件组:
1、新建不同文件组若存放在不同逻辑磁盘可以提高io并发能力;
2、同时不同文件可以提高容灾的能力,在某个文件发生顺坏,其他文件可以继续使用。
3、分开文件存储,也可实现不同分区独立备份,提高了数据恢复速率。
依据已经新建分区函数【pf_PartionTest01】和默认已有文件组,新建以下分区架构:
/*新建分区架构*/ USE [PartionTest]; CREATE PARTITION SCHEME [pc_PartionTest01] AS PARTITION [pf_PartionTest01] TO (‘Primary‘, ‘PartionTest201412‘, ‘PartionTest201412‘) /*分区架构查询*/ SELECT ps.name partition_scheme, ds.name filegroup, pf.name partition_function, pf.type_desc+‘:‘+case when pf.boundary_value_on_right=0 then ‘Left‘ else ‘Rigth‘ end function_type FROM sys.partition_schemes ps JOIN sys.destination_data_spaces dds ON ps.data_space_id=dds.partition_scheme_id JOIN sys.data_spaces ds ON dds.data_space_id=ds.data_space_id JOIN sys.partition_functions pf ON ps.function_id=pf.function_id 结果如下图所示:
3、创建分区表
如下图所示,只要制定分区架构和分区依据列即可.