设为首页 收藏本站
查看: 1219|回复: 0

[经验分享] SQL SERVER 表分区实施步奏

[复制链接]

尚未签到

发表于 2015-6-27 21:19:14 | 显示全部楼层 |阅读模式
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)修改表
DSC0000.png

2)移除主键
DSC0001.png

3)新建主键
DSC0002.png

4)设置关联
DSC0003.png

因为主键要求唯一性,所以这里需要做2个字段的关联主键(ID与SaleTime)
DSC0004.png

5)修改主键为非聚集
DSC0005.png

成功后的效果
DSC0006.png

完成后记得保存表
创建文件组和数据文件
因为表分区时按照文件组为单位保存了,而实际数据是保存在这个文件组所包含的文件中的,所以为了高效率,可以一个文件组对应一个数据文件来保存数据,下面我们以月为单位创建文件组
DSC0007.png

DSC0008.png
DSC0009.png
到这里已经把文件组和数据文件创建完毕并建立了对应关系,点击确定键后,在对应的目录下可以看到已经生成了我们设定的12个数据文件了。
DSC00010.png

创建分区函数(无法可视化实现)



-- 第四步 创建分区函数
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是分区方案
DSC00011.png
创建好了以后在数据库中右键表名点击属性可以查看到类似如下的效果表示创建成功
统计各数据组中包含的数据条数



-- 统计所有分区表中的记录总数   
select $PARTITION.partfunSale(SaleTime) as 分区编号,count(id) as 记录数from Sale group by $PARTITION.partfunSale(SaleTime)  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81084-1-1.html 上篇帖子: 获取SQL Server的当前连接数 下篇帖子: SQL Server中的高可用性(2)----文件与文件组
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表