SQL SERVER 表分区实施步奏
1. 概要说明
SQL SERVER的表分区功能是为了将一个大表(表中含有非常多条数据)的数据根据某条件(仅限该表的主键)拆分成多个文件存放,以提高查询数据时的效率。创建表分区的主要步骤是1、确定需要以哪一个字段作为分区条件;2、拆分成多少个文件保存该表;3、分区函数(拆分条件);4、分区方案(按拆分函数拆分后需要对应到哪些文件组中去)。
下面就一步一步来说明如何创建表分区:
2. 准备工作
创建一个测试表
CREATE TABLE Sale( [Id] [int] IDENTITY(1,1) NOT NULL, --自动增长 [Name] [varchar](16) NOT NULL, [SaleTime] [datetime] NOT NULL, CONSTRAINT [PK_Sale] PRIMARY KEY CLUSTERED --创建主键 ( [Id] ASC ) )
插入测试数据
insert Sale ([Name],[SaleTime]) values (‘张三‘,‘2009-1-1‘) insert Sale ([Name],[SaleTime]) values (‘李四‘,‘2009-2-1‘) insert Sale ([Name],[SaleTime]) values (‘王五‘,‘2009-3-1‘) insert Sale ([Name],[SaleTime]) values (‘钱六‘,‘2012-4-1‘) insert Sale ([Name],[SaleTime]) values (‘赵七‘,‘2012-6-1‘) insert Sale ([Name],[SaleTime]) values (‘张三‘,‘2012-6-1‘) insert Sale ([Name],[SaleTime]) values (‘李四‘,‘2012-7-1‘) insert Sale ([Name],[SaleTime]) values (‘王五‘,‘2012-8-1‘) insert Sale ([Name],[SaleTime]) values (‘钱六‘,‘2012-10-1‘) insert Sale ([Name],[SaleTime]) values (‘赵七‘,‘2012-10-1‘) insert Sale ([Name],[SaleTime]) values (‘张三‘,‘2012-11-1‘) insert Sale ([Name],[SaleTime]) values (‘李四‘,‘2013-12-1‘) insert Sale ([Name],[SaleTime]) values (‘王五‘,‘2014-12-1‘)
3. 实现步骤
主键设置
表分区需要先确定一个字段,按此字段的某个条件进行拆分,我们这里以Saletime列为例,按月为单位对Sale表进行拆分。因为需要拆分的列必须是主键,所以我们这里先删除原来建表时对ID字段创建的主键,改为SaleTime字段(注意用非聚集主键)
1)修改表
2)移除主键
3)新建主键
4)设置关联
因为主键要求唯一性,所以这里需要做2个字段的关联主键(ID与SaleTime)
5)修改主键为非聚集
成功后的效果
完成后记得保存表
创建文件组和数据文件
因为表分区时按照文件组为单位保存了,而实际数据是保存在这个文件组所包含的文件中的,所以为了高效率,可以一个文件组对应一个数据文件来保存数据,下面我们以月为单位创建文件组
到这里已经把文件组和数据文件创建完毕并建立了对应关系,点击确定键后,在对应的目录下可以看到已经生成了我们设定的12个数据文件了。
创建分区函数(无法可视化实现)
-- 第四步 创建分区函数 CREATE PARTITION FUNCTION partfunSale (DATETIME) AS RANGE RIGHT FOR VALUES ( ‘2012-02-01‘,‘2012-03-01‘,‘2012-04-01‘,‘2012-05-01‘,‘2012-06-01‘, ‘2012-07-01‘,‘2012-08-01‘,‘2012-09-01‘,‘2012-10-01‘,‘2012-11-01‘,‘2012-12-01‘ )
上面这段的含义是创建一个以Datetime字段类型的分区函数,需要注意的是12个文件组对应11个Values,因为分区的规则是
文件组1 ———》2012-02-01之前的数据(日期>2012-02-01)
文件组2 ———》2012-02-01之后2012-03-01之前的数据(2012-02-01≤日期<2012-03-01)
文件组3 ———》2012-03-01之后2012-04-01之前的数据(2012-02-01≤日期<2012-03-01)
文件组4 ———》2012-04-01之后2012-05-01之前的数据(2012-02-01≤日期<2012-03-01)
文件组5 ———》2012-05-01之后2012-06-01之前的数据(2012-02-01≤日期<2012-03-01)
文件组6 ———》2012-06-01之后2012-07-01之前的数据(2012-02-01≤日期<2012-03-01)
文件组7 ———》2012-07-01之后2012-08-01之前的数据(2012-02-01≤日期<2012-03-01)
文件组8 ———》2012-08-01之后2012-09-01之前的数据(2012-02-01≤日期<2012-03-01)
文件组9 ———》2012-09-01之后2012-10-01之前的数据(2012-02-01≤日期<2012-03-01)
文件组10 ———》2012-10-01之后2012-11-01之前的数据(2012-02-01≤日期<2012-03-01)
文件组11 ———》2012-11-01之后2012-12-01之前的数据(2012-02-01≤日期<2012-03-01)
文件组12 ———》2012-12-01之后的数据(2012-02-01≤日期<2012-03-01)
创建分区方案(无法可视化实现)
将创建的分区函数与文件组进行关联
-- 第四步 创建分区方案(注意要比分区函数多一项) CREATE PARTITION SCHEME partschSale AS PARTITION partfunSale TO ( Saletime201201, Saletime201202, Saletime201203, Saletime201204, Saletime201205, Saletime201206, Saletime201207, Saletime201208, Saletime201209, Saletime201210, Saletime201211, Saletime201212 )
关联到表(无法可视化实现)
将设置好的分区方案与具体的表进行关联
-- 第五步 设置分区方案到指定表 CREATE CLUSTERED INDEX CT_Sale ON Sale([SaleTime]) ON partschSale([SaleTime])
其中Sale是表名,SaleTime是拆分时依据的字段,partschSale是分区方案
创建好了以后在数据库中右键表名点击属性可以查看到类似如下的效果表示创建成功
统计各数据组中包含的数据条数
-- 统计所有分区表中的记录总数 select $PARTITION.partfunSale(SaleTime) as 分区编号,count(id) as 记录数from Sale group by $PARTITION.partfunSale(SaleTime)