咱们知道不少事情都存在一个分治的思想,一样的道理咱们也能够用到数据表上,当一个表很大很大的时候,咱们就会想到将表拆sql
分红不少小表,查询的时候就到各个小表去查,最后进行汇总返回给调用方来加速咱们的查询速度,固然切分可使用横向切分,纵向数据库
切分,好比咱们最熟悉的订单表,一般会将三个月之外的订单放到历史订单表中,这里的三个月就是将订单表进行切分的依据。服务器
好了,分区表的好处我想你们都很清楚了,下面咱们看看如何实现。架构
一:分区表函数
这里咱们作个例子,建立一个test数据库,表名为shop,以createtime做为分区依据。测试
1:肯定分区依据spa
怎么分区的话,这个要看具体业务逻辑了,你能够按照时间,地区,求模等等均可以。3d
2:建立文件组code
既然是文件组,确定是对文件进行分类管理的,默认状况下就一个mdf和ldf文件,当全部的数据都挤压在mdf上,确实不是一个blog
很好的事情,下降咱们的查询速度,当用到文件组的时候就能够建立多个ndf来分摊mdf中的数据,甚至还能够将ndf分摊到几个磁盘
上,充分利用服务器多核处理能力,说了这么多,咱们看看sql语句咋搞,这里我建立四个文件组,分别存放2013以前,2013,2014
和2014年以后的数据。
1 alter database Test add filegroup Before2013 2 alter database Test add filegroup T2013 3 alter database Test add filegroup T2014 4 alter database Test add filegroup After2014
3:建立文件
根据上面在文件组上的概述,文件的做用你们都知道了,这里咱们要作的是,将次文件.ndf附加到文件组上,由于我建立了4个文件组,
因此我也建立4个文件分别存放在这4个文件组中。
1 alter database Test add file 2 (Name=N'Before2013',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Before20131.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) 3 to filegroup Before2013 4 alter database Test add file 5 (Name=N'T2013',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\T20131.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) 6 to filegroup T2013 7 alter database Test add file 8 (Name=N'T2014',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\T20141.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) 9 to filegroup T2014 10 alter database Test add file 11 (Name=N'After2014',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\After20141.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) 12 to filegroup After2014
4:编写分区函数
刚才也说了,咱们是按照时间进行切分的,将数据表数据分红:
① 2013年以前
② 2013-2014
③ 2014-2015
④ 2015以后
既然都知道依据了,咱们分区函数也方便写了。
1 create partition function RangeTime (datetime) 2 as range left for values ('2012-12-31','2013-12-31','2014-12-31')
从上面的sql,咱们能够看到三个点将时间轴分红了4段
第一:rangeTime 为分组函数名。
第二:left 其实就是当时间点在边界时到底属于左侧仍是右侧,由于这里是left,因此属于左侧,若是是right关键词,那就属于右侧了。
5:编写分区方案
分区方案也就是将分区函数与文件组进行一个关联,刚才也说了,3个时间点将一个时间轴分红了4部分,恰好对应了4个文件组。
那么具体的sql写法以下:
1 create partition scheme RangeSchema_CreateTime 2 as partition RangeTime 3 to (before2013,T2013,T2014,after2014)
6:建立分区表
跟普通表建立有点不同,分区表的建立还须要指定这个分区须要使用哪一个分区方案下的分区字段,那么这里就是RangeSchema_CreateTime
中的CreateTime字段。
1 create table Shop 2 ( 3 ID varchar(50), 4 ShopName varchar(50), 5 CreateTime datetime 6 ) on RangeSchema_CreateTime(CreateTime)
这里要注意,若是在建立表的时候指定了ID为主键的话,这个时候须要指定ID为分区字段,不然会报错的。
这时候能够在不要主键的状况下先建立表,而后再指定ID为主键。
7:插入测试数据并统计
这里我先插入10w条数据,而后来看看数据在各个分区的状况。‘
<1>插入数据
<2> 统计每一个分区的数据量
这里主要有一个查询分区的关键字“$partition”,很是的有用。
好了,到这个咱们经过sql语句来实现分区表就已经完成了。
二:使用管理界面建立分区表
1:首先咱们建立test1数据库和shop表
2:建立文件组和文件
3:建立分区
①:右键Shop表,弹出菜单中选择 “存储” => "建立分区"
②:建立“分区函数”名 和 “分区方案”名。
③:建立分区映射,也就是将”分区函数“和“文件组”进行关联。
④: 最后咱们能够看一下界面给我生成的分区函数以及分区方案,蛮有意思的。
1 USE [Test1] 2 GO 3 BEGIN TRANSACTION 4 CREATE PARTITION FUNCTION [MyRangeCreatTime](datetime) AS RANGE LEFT FOR VALUES (N'2012-12-31T00:00:00', N'2013-12-31T00:00:00', N'2014-12-31T00:00:00') 5 6 7 CREATE PARTITION SCHEME [MySchemeCreateTime] AS PARTITION [MyRangeCreatTime] TO ([Before2013], [T2013], [T2014], [After2014]) 8 9 10 ALTER TABLE [dbo].[Shop] DROP CONSTRAINT [PK__Shop__3214EC277F60ED59] 11 12 13 ALTER TABLE [dbo].[Shop] ADD PRIMARY KEY NONCLUSTERED 14 ( 15 [ID] ASC 16 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 17 18 19 CREATE CLUSTERED INDEX [ClusteredIndex_on_MySchemeCreateTime_635288828144372217] ON [dbo].[Shop] 20 ( 21 [CreateTime] 22 )WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [MySchemeCreateTime]([CreateTime]) 23 24 25 DROP INDEX [ClusteredIndex_on_MySchemeCreateTime_635288828144372217] ON [dbo].[Shop] WITH ( ONLINE = OFF ) 26 27 28 29 30 COMMIT TRANSACTION
从图中能够看到生成好的分区函数名”[MyRangeCreatTime]“ 和分区架构名“[MySchemeCreateTime]”,最后咱们执行下该sql就ok了。
⑤ 插入测试数据并进行简单的测试
这里测试下“2013-1-1”是在哪一个分区下。