sql server 小记——分区表(上)

来源:互联网 发布:大连淘宝客服招聘 双休 编辑:程序博客网 时间:2024/05/22 03:48

我们知道很多事情都存在一个分治的思想,同样的道理我们也可以用到数据表上,当一个表很大很大的时候,我们就会想到将表拆

分成很多小表,查询的时候就到各个小表去查,最后进行汇总返回给调用方来加速我们的查询速度,当然切分可以使用横向切分,纵向

切分,比如我们最熟悉的订单表,通常会将三个月以外的订单放到历史订单表中,这里的三个月就是将订单表进行切分的依据。

 

  好了,分区表的好处我想大家都很清楚了,下面我们看看如何实现。

一:分区表

  这里我们做个例子,创建一个test数据库,表名为shop,以createtime作为分区依据。

1:确定分区依据

     怎么分区的话,这个要看具体业务逻辑了,你可以按照时间,地区,求模等等都可以。

 

2:创建文件组

   既然是文件组,肯定是对文件进行分类管理的,默认情况下就一个mdf和ldf文件,当所有的数据都挤压在mdf上,确实不是一个

很好的事情,降低我们的查询速度,当用到文件组的时候就可以创建多个ndf来分摊mdf中的数据,甚至还可以将ndf分摊到几个磁盘

上,充分利用服务器多核处理能力,说了这么多,我们看看sql语句咋搞,这里我创建四个文件组,分别存放2013之前,2013,2014

和2014年之后的数据。

1 alter database Test add filegroup Before20132 alter database Test add filegroup T20133 alter database Test add filegroup T20144 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 T201410 alter database Test add file11 (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_CreateTime2 as partition RangeTime3 to (before2013,T2013,T2014,after2014)

6:创建分区表
  

    跟普通表创建有点不一样,分区表的创建还需要指定这个分区需要使用哪个分区方案下的分区字段,那么这里就是RangeSchema_CreateTime

中的CreateTime字段。

1 create table Shop2 (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] ASC16 )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”是在哪个分区下。

 

  

 

分类: VS不得不会的技巧, sql server
好文要顶 关注我 收藏该文  
一线码农
关注 - 56
粉丝 - 6490
荣誉:推荐博客
+加关注
19
0
(请您对文章做出评价)
« 上一篇:vs中不得不会的一些小技巧(1)——细说查找
» 下一篇:经典算法题每日演练——第二十二题 奇偶排序
posted @ 2014-02-25 00:12 一线码农 阅读(6010) 评论(19) 编辑 收藏

  
#1楼2014-02-25 07:15 @清道夫  
又见好文
支持(0)反对(0)
  
#2楼2014-02-25 08:54 有一点难  
不错学习了。谢谢。
支持(0)反对(0)
  
#3楼2014-02-25 09:25 倚天照海- -  
好久没见了 谢谢分享
支持(0)反对(0)
  
#4楼2014-02-25 10:00 leowork  
曾经公司有过这个需求,还让我做demo..无奈水平不足,最后转给同事了。
这个可以做的更强大一些, 比如随着时间的推移自动的增加分区,自动归档/删除历史数据,每隔一定的时间自动的把SSD上的数据转移到HDD上面(其实 就是auto- sliding window)。。
支持(1)反对(0)
  
#5楼[楼主2014-02-25 10:26 一线码农  
@ 极限Limit
什么时候厂长也发些好文啊
支持(0)反对(0)
  
#6楼[楼主2014-02-25 10:26 一线码农  
@ 倚天照海- -
好久不见啊
支持(0)反对(0)
  
#7楼[楼主2014-02-25 10:26 一线码农  
@ 有一点难
tks支持
支持(0)反对(0)
  
#8楼[楼主2014-02-25 10:27 一线码农  
@ _leox
确实可以做成这样的,向你学习。
支持(0)反对(0)
  
#9楼2014-02-25 11:46 vians  
@ _leox
大神啊,可否提供这方面的资料,学习一下如何随着时间的推移自动的增加分区,自动归档/删除历史数据
支持(0)反对(0)
  
#10楼2014-02-25 11:46 vians  
这方面其实挺好了,我觉得leox说的没错,如果是随着时间的推移自动的增加分区,自动归档/删除历史数据,这样就更好了,学习学习啊。。。
支持(0)反对(0)
  
#11楼2014-02-25 12:26 有一点难  
要是再分享一个 随着时间的推移自动的增加分区 那就景上添花了。
支持(0)反对(0)
  
#12楼2014-02-27 17:31 leowork  
@ vians
说笑了, 我大神的皮毛都没学到。当时是我们的team leader让我research
的。具体的功能其实我也没有做出来。他当时设想的是做一个console application,然后让这个程序每个月自己跑一次,去操作数据库里面的分区。
具体的你可以google Sliding Window Partitioning。当时我找到的一些链接:1)http://www.sqlskills.com/blogs/kimberly/clarifying-left-and-right-in-the-defintion-of-a-partition-function-in-sql-server-2005/
2)http://weblogs.sqlteam.com/dang/archive/2011/04/17/move-a-partition-to-a-different-file-group-efficiently.aspx
3)
http://www.mssqltips.com/sqlservertip/1914/sql-server-database-partitioning-myths-and-truths/
还有一个实例,我当时就是根据这个修改的
http://sqlpartitionmgmt.codeplex.com/
支持(0)反对(0)
  
#13楼2014-02-28 19:39 xiaxc  
学习
支持(0)反对(0)
  
#14楼2014-03-14 15:16 寻找灯塔ing  
楼主,在招聘,第一感觉像是外包。。。我从心里害怕外包,想问问
支持(0)反对(0)
  
#15楼2014-03-16 12:23 wanglgkaka  
怎么只有小记(上) 没有看到 (下)?
支持(0)反对(0)
  
#16楼2014-03-21 13:47 立志做大神  
线哥辛苦了
支持(0)反对(0)
  
#17楼2014-04-03 10:49 Jbp  
我了个去 这个文章 太好了 写的非常全面 和详细 继续期待 更好的技术分享。。。
支持(0)反对(0)
  
#18楼2015-06-09 14:54 syzhang  
期待楼主的续篇!!!
支持(0)反对(0)
  
#19楼2015-06-17 16:52 wujf  
好文,期待楼主更高端的架构
0 0
原创粉丝点击