第四章
1、对现有普通表进行分区
2、对现有分区表进行添加一个分区
3、对现有分区表进行删除一个分区
4、对现有分区表进行修改分区
5、把现有分区表改回原普通表
----------------------------------------华丽的分割线-----------------------------------------
1、对现有普通表表进行分区
创建普通表a,为表a添加数据,代码如下:
--创建数据库表a
if object_id('[a]') is not null drop table [a]
go
create table [a]
(
[ID] int,
[品名] varchar(6),
[入库数量] int,
[入库时间] datetime
CONSTRAINT [PK_a] PRIMARY KEY CLUSTERED --创建主键
(
[Id] ASC
)
)
--为表a添加测试数据
insert [a]
select 1,'矿泉水',100,'2014-01-02' union all
select 2,'方便面',60,'2014-01-03' union all
select 3,'方便面',50,'2014-01-03' union all
select 4,'矿泉水',80,'2014-01-04' union all
select 5,'方便面',60,'2014-01-05' union all
select 6,'方便面',50,'2014-01-06' union all
select 7,'矿泉水',80,'2014-01-06' union all
select 8,'方便面',60,'2014-01-07' union all
select 9,'方便面',50,'2014-01-09' union all
select 10,'矿泉水',80,'2014-01-11'
select * from a
查询结果如图1所示
图1
右键表a属性查看,如图2所示,表a为普通表,并未分区。
图2
下面是为表a进行分区:
①、删除表a主键(聚集索引)
②、创建一个新的聚集索引,在此聚集索引中使用分区方案
③、创建主键,只能设定为非聚集索引
【这里是参考代码:第一章 分区函数 和 分区方案 代码】
代码如下:
--删除主键(聚集索引)
ALTER TABLE a DROP constraint PK_a
--创建一个新的聚集索引,在该聚集索引中使用分区方案
create CLUSTERED INDEX PK_a ON a([id])
ON partschA([id])
--创建主键,但不设为聚集索引
ALTER TABLE a ADD CONSTRAINT PK_a1 PRIMARY KEY NONCLUSTERED
(
[ID] ASC
) ON [PRIMARY]
查看表a,如图3所示:
图3
表a现在是分区表了。
----------------------------------------华丽的分割线-----------------------------------------
首先来看一下分区表a的分区方案和分区函数,代码如下:
--创建分区函数(分成三个区,1区小于等于3的、2区大于3小于等于6的、3区大于6的)
CREATE PARTITION FUNCTION partfunA (int)
AS RANGE LEFT FOR VALUES (3,6)
--创建分区方案(将已分区的数据放在主文件里,三个区都放在主文件里)
CREATE PARTITION SCHEME partschA
AS PARTITION partfunA
TO ([Primary],[Primary],[Primary])
添加一个分区:
①、修改分区方案,指定下一个分区的文件组
②、修改分区函数
代码如下:
--修改分区方案,指定下一个分区的文件组为[Primary]
ALTER PARTITION SCHEME partschA
NEXT USED [Primary]
--修改分区函数,修改后为4个区(1区小于等于3的、2区大于3小于等于6的、3区大于6小于等于8的、4区大于8的)
ALTER PARTITION FUNCTION partfunA()
SPLIT RANGE (8)
注释:
①、 NEXT USED [Primary]:指定下一个分区的文件组为[Primary]
②、SPLIT RANGE (8) :类似于开始创建时的
CREATE PARTITION FUNCTION partfunA (int)
AS RANGE LEFT FOR VALUES (3,6,8)
修改后为4个区(1区小于等于3的、2区大于3小于等于6的、3区大于6小于等于8的、4区大于8的)
查看分区及分区数据:
代码如下:
--查看分区
select $partition.partfunA(id) as '分区号',count(*) as '分区内数据个数'
from a group by $partition.partfunA(id)
--查看各分区数据
select * from a where $partition.partfunA(id)=1
select * from a where $partition.partfunA(id)=2
select * from a where $partition.partfunA(id)=3
select * from a where $partition.partfunA(id)=4
查询结果图4所示:
图4
----------------------------------------华丽的分割线-----------------------------------------
3、对现有分区表进行删除一个分区
修改分区函数,代码如下:
--删除一个分区(即剩下3个分区,1区小于等于6的、2区大于6小于等于8的、3区大于8的)
ALTER PARTITION FUNCTION partfunA()
MERGE RANGE (3)
查看分区及分区数据:
代码如下:
--查看分区
select $partition.partfunA(id) as '分区号',count(*) as '分区内数据个数'
from a group by $partition.partfunA(id)
--查看各分区数据
select * from a where $partition.partfunA(id)=1
select * from a where $partition.partfunA(id)=2
select * from a where $partition.partfunA(id)=3
select * from a where $partition.partfunA(id)=4
如图5所示,表a只剩下3个分区。
图5
----------------------------------------华丽的分割线-----------------------------------------
4、对现有分区表进行修改分区
修改分区,其实就是重复操作2和3,,即删除原有分区再添加新的分区。
----------------------------------------华丽的分割线-----------------------------------------
5、把现有分区表改回原普通表
这里我利用的是聚集索引和表分区冲突的原理,进行的把分区表改成普通表。
①、删除分区索引(因为一个表只能有一个聚集索引,这里分区索引就是聚集索引;所以我们想新建一个聚集索引是做不到的,只能先把分区索引删掉)
②、删除主键(非聚集索引),之前我们在ID上设置了主键,但生成的是非聚集索引。这里我们要在这个主键ID上建立新的聚集索引,所以要先把之前的非聚集索引删掉。
③、重建聚集索引
代码如下:
--删除分区索引
drop index a.PK_a
--删除主键(非聚集索引)
ALTER TABLE a DROP constraint PK_a1
--重建聚集索引
ALTER TABLE a ADD CONSTRAINT PK_a PRIMARY KEY CLUSTERED
(
[ID] ASC
) ON [PRIMARY]
这是我们查看表a,如图6所示:
图6
----------------------------------------华丽的分割线-----------------------------------------
折腾的差不多了,我也仅仅是个SQL的爱好者,如有不正确的地方,欢迎批评指正。