您的位置:首页 > 博客中心 > 数据库 >

SQL Server表分区详解

时间:2022-03-10 17:22

转载收藏于:http://www.cnblogs.com/knowledgesea/p/3696912.html

 

什么是表分区

一般情况下,我们建立数据库表时,表数据都存放在一个文件里。

但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理。这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的。

所以大数据量的数据表,对分区的需要还是必要的,因为它可以提高select效率,还可以对历史数据经行区分存档等。但是数据量少的数据就不要凑这个热闹啦,因为表分区会对数据库产生不必要的开销,除啦性能还会增加实现对象的管理费用和复杂性。

跟着做,分区如此简单

先跟着做一个分区表(分为11个分区),去除神秘的面纱,然后咱们再逐一击破各个要点要害。

分区是要把一个表数据拆分为若干子集合,也就是把把一个数据文件拆分到多个数据文件中,然而这些文件的存放可以依托一个文件组或这多个文件组,由于多个文件组可以提高数据库的访问并发量,还可以把不同的分区配置到不同的磁盘中提高效率,所以创建时建议分区跟文件组个数相同。

1.创建文件组

可以点击数据库属性在文件组里面添加

T-sql语法:

alter database <数据库名> add filegroup <文件组名>
gxlsystem.com,布布扣

这里举例说下选择列的意思:

假如你选择的是int类型的列:那么你的分区可以指定为1--100W是一个分区,100W--200W是一个分区....

假如你选择的是datatime类型:那么你的分区可以指定为:2014-01-01--2014-01-31一个分区,2014-02-01--2014-02-28一个分区...

根据这样的列数据规则划分,那么在那个区间的数据,在插入数据库时就被指向那个分区存储下来。

 

我这里选用orderid int类型 --- >> 下一步 --- >>

gxlsystem.com,布布扣

gxlsystem.com,布布扣

gxlsystem.com,布布扣

左边界右边界:就是把临界值划分给上一个分区还是下一个分区。一个小于号,一个小于等于号。

然后下一步下一步最后你会得到分区函数和分区方案。

gxlsystem.com,布布扣

说两句:

可见反常现象,扫描次数跟逻辑读取次数都是无分区表的2倍之多,但查询速度却是快啦不少啊。这就是分区的神奇之处啊,所以要相信这世界一切皆有可能。

分区函数,分区方案,分区表,分区索引

1.分区函数

指定分依据区列(依据列唯一),分区数据范围规则,分区数量,然后将数据映射到一组分区上。

创建语法: 

create partition function 分区函数名(<分区列类型>) as range [left/right] 
for values (每个分区的边界值,....) 
--创建分区函数
CREATE PARTITION FUNCTION [bgPartitionFun](int) AS RANGE LEFT FOR VALUES (N‘1000000‘, N‘2000000‘, N‘3000000‘, N‘4000000‘, N‘5000000‘, N‘6000000‘, N‘7000000‘, N‘8000000‘, N‘9000000‘, N‘10000000‘)

然而,分区函数只定义了分区的方法,此方法具体用在哪个表的那一列上,则需要在创建表或索引是指定。 

删除语法:

--删除分区语法
drop partition function <分区函数名>
--删除分区函数 bgPartitionFun
drop partition function bgPartitionFun

需要注意的是,只有没有应用到分区方案中的分区函数才能被删除。

2.分区方案

指定分区对应的文件组。

创建语法: 

--创建分区方案语法
create partition scheme <分区方案名称> as partition <分区函数名称> [all]to (文件组名称,....) 
--创建分区方案,所有分区在一个组里面
CREATE PARTITION SCHEME [bgPartitionSchema] AS PARTITION [bgPartitionFun] TO ([ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1])

分区函数必须关联分区方案才能有效,然而分区方案指定的文件组数量必须与分区数量一致,哪怕多个分区存放在一个文件组中。

删除语法:

--删除分区方案语法
drop partition scheme<分区方案名称>
--删除分区方案 bgPartitionSchema
drop partition scheme bgPartitionSchema1

只有没有分区表,或索引使用该分区方案是,才能对其删除。

3.分区表

创建语法:

--创建分区表语法
create table <表名> (
  <列定义>
)on<分区方案名>(分区列名)
gxlsystem.com,布布扣

3.查看指定分区中的数据记录 

---查看指定分区中的数据记录
select * from bigorder where $partition.bgPartitionFun(orderid)=2

结果:数据从1000001开始到200W结束

分区的拆分与合并以及数据移动

 1.拆分分区

在分区函数中新增一个边界值,即可将一个分区变为2个。

--分区拆分
alter partition function bgPartitionFun()
split range(N‘1500000‘)  --将第二个分区拆为2个分区

注意:如果分区函数已经指定了分区方案,则分区数需要和分区方案中指定的文件组个数保持对应一致。

 2.合并分区

 与拆分分区相反,去除一个边界值即可。

--合并分区
alter partition function bgPartitionFun()
merge range(N‘1500000‘)  --将第二第三分区合并

3.分区中的数据移动

 你或许会遇到这样的需求,将普通表数据复制到分区表中,或者将分区表中的数据复制到普通表中。

 那么移动数据这两个表,则必须满足下面的要求。

  • 字段数量相同,对应位置的字段相同
  • 相同位置的字段要有相同的属性,相同的类型。
  • 两个表在一个文件组中

1.创建表时指定文件组

--创建表
create table <表名> (
  <列定义>
)on <文件组名>

2.从分区表中复制数据到普通表

--将bigorder分区表中的第一分区数据复制到普通表中
alter table bigorder switch partition 1 to <普通表名>

3.从普通标中复制数据到分区表中

这里要注意的是要先将分区表中的索引删除,即便普通表中存在跟分区表中相同的索引。

--将普通表中的数据复制到bigorder分区表中的第一分区
alter table <普通表名> switch to bigorder partition 1 

分区视图

分区视图是先建立带有字段约束的相同表,而约束不同,例如,第一个表的id约束为0--100W,第二表为101万到200万.....依次类推。

创建完一系列的表之后,用union all 连接起来创建一个视图,这个视图就形成啦分区视同。

很简单的,这里我主要是说分区表,就不说分区视图啦。。

 

SQL Server表分区详解,布布扣,bubuko.com

热门排行

今日推荐

热门手游