数据分区

分区是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性。它能将大型表拆分到多个存储结构中。通过对表进行分区,表、索引和索引视图可以在多个文件组上创建。

分区提高了数据库的读写能力,提高了效率,但是分区是把双刃剑,要弄明白什么时候该用什么时候不该用。
比如:订单,假设我们按照月份分区,1年12个分区,当我们按照月份去查订单记录的时候,这当然会提高效率,但如果我们按照某个客户去查订单记录,这个效率就不一定高了,数据在不同的分区,CPU可以在几个磁盘上同步读取,然后合并,但这个效率不一定比连续从一个分区读取的效率高。所以要用好分区这个功能,就要认真分析项目需求和数据结构,做好方案。

以下是分区的一个基本步骤
1、创建分区函数(确定数据分割的边界点)
Create Partition Function mypartfunction (int)
As Range Left                        (边界点包含到左边分区)
For Values(10,20,30,40,50)
[NULL值总是存储在最左边的分区,除非显式指定NULL是一个边界点,并且使用RANGE RIGHT]
select * from sys.partition_range_values  --查看分区函数目录

2、创建分区方案(将分区映射到文件组上)
Create Partition Scheme mypartscheme
As Partition mypartfunction
To(FileGroup1,FileGroup2,FileGroup3,FileGroup4,FileGroup5,FileGroup6)
[文件组必须是数据库中现有的]
select * from sys.partition_schemes --查看分区方案

3、创建使用分区表(将分区方案应用到表上,索引同理,用ON子句指定分区方案)
Create Table T_Num(Num int)
On mypartscheme(Num)

4、向表中插入数据
Insert Into T_Num(Num) Values(10)
Insert Into T_Num(Num) Values(11)
Insert Into T_Num(Num) Values(15)
Insert Into T_Num(Num) Values(23)
Insert Into T_Num(Num) Values(26)
Insert Into T_Num(Num) Values(39)
Insert Into T_Num(Num) Values(41)
Insert Into T_Num(Num) Values(45)
Insert Into T_Num(Num) Values(58)
Insert Into T_Num(Num) Values(60)
Insert Into T_Num(Num) Values(88)
Insert Into T_Num(Num) Values(200)

使用下面的语句查看数据分布情况
Select * From sys.partitions Where object_id=OBJECT_ID('T_Num') 

5、更改分区方案(在现有分区方案中添加文件组)
Alter Partition Scheme mypartscheme
Next Used [FileGroup7]

6、添加新的边界点
Alter Partition Function mypartfunction()
Split Range(100)
[删除边界点 Alter Partition Function mypartfunction()  Merge Range(100) ]
这一步有可能造成大量磁盘I/O,慎用!!!

7、创建一个存档表(将小于等于10的数备份到另一个表中)
Create Table T_Num_Bak(Num Int)
On FileGroup1

8、将分区1的记录备份到T_NUM_BAK表
Alter Table T_Num
Switch Partition 1 To T_Num_Bak
(参考文章下面的SWITCH运算符)

9、删除边界点
Alter Partition Function mypartfunction()
Merge Range(10)

以下总结一些知识及注意事项
1、分区函数:
一个对象最多可以有1000个分区,所以,最多可以指定999个边界点
分区函数的数据类型不能是text、ntext、image、varbinary(max)、timestamp、xml和varchar(max);不能使用用户自定义数据类型和CLR数据类型;非精确数据类型必须持久化。
2、分区方案:
Create Partition Scheme语句中指定的任何文件组必须是数据库中现有的文件组
如果使用ALL关键字,那么只能指定一个文件组
3、SWITCH运算符
[可以简单的理解为不锁定不阻塞的将表中某部分数据先select..into..到另一个表,然后delete这部分数据]
[源表和目标表结构必须位于同一文件组,目标表必须为空,数据移出后,源表该分区数据不再存在]
SWITCH是以一种完全可伸缩的方式在表之间交换分区,同时不发生锁定、阻塞或死锁。SWITCH使用要求:
    来源和目标表的数据和索引必须对齐
    来源和目标表必须具有相同的结构
    数据不能从一个文件组移到另一个
    两个数据分区不可交换
    目标分区必须空白(目标表必须空)
    来源或目标表不能参加复制
    来源或目标表不能定义全文索引或FILESTREAM数据类型

PS:如果表及其索引使用相同的分区函数进行分区,就说他们对齐了。如果表及其索引都使用相同的分区函数和分区方案,那么存储也对齐了。

本文出自 “杨金澎” 博客,谢绝转载!

你可能感兴趣的:(sql,分区)