文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>SQL server 2005基于已存在的表创建分区

SQL server 2005基于已存在的表创建分区

时间:2010-11-17  来源:江宇旋


二、主要步骤:对于已经存在的表,我们可以采取以下步骤来对其创建分区表
    1.创建分区函数
    2.创建分区架构并关联到分区函数
    3.删除已经存在的聚集索引
    4.基于分区架构重建聚集索引


三、实验环境:
    1. windows xp pro (英文版) + sp2

    2. SQL server 2005 Developer + sp3
    3.实验数据库Performance,此数据库参照实验二:SQL server 2005高可用性之----数据库镜像中的生成脚本生成数据库,本实验对其数据库的存放做了调整,将数据和日志文件存放在D:\SQL_Data\Performance目录下。
    4.对已存在要创建的分区表为:Performance数据库下的Orders表.
    5.对Orders表中的orderdate列按年进行水平分区


四、具体试验步骤:    
    1.创建分区函数
       确定分区的数目及分区的列,列的数据类型。本例将Orders表的orderdate按年份水平分五个区,则需要定义四个边界点值。如下,


use Performance;
go     
Create partition function
Part_func_orders(datetime) as
range left
for values('20021231 23:59:59.997',
                 '20031231 23:59:59.997',
                 '20041231 23:59:59.997',
                 '20051231 23:59:59.997');
go
--或者使用range right来创建分区函数
Create partition function
Part_func_orders(datetime) as
range right
for values('20030101 00:00:00.000',
                 '20040101 00:00:00.000',
                 '20050101 00:00:00.000',
                 '20060101 00:00:00.000');
go
/*分区值的表示范围(使用range left)
–infinity < x1 <= 20021231
 20030101 < x2 <= 20031231
 20040101 < x3 <= 20041231
 20050101 < x4 <= 20051231
 20060101 < x5 <= +infinity
infinity本应当为20020101或20061231,此处仅用于说明表示范围
----------------------------------------------------------
分区值的表示范围(使用range right)
–infinity < x1 < 20030101
 20030101 <= x2 < 20040101
 20040101 <= x3 < 20050101
 20050101 <= x4 < 20060101
 20060101 <= x5 < +infinity
通过以上分析表明当range中使用left时,分区的范围右边为小于等于values所指定的值,
当range中使用right时,分区范围左边为大于等于values所指定的值。 

规律:在使用 LEFT 分区函数时,第一个值将作为第一个分区中的上边界。在使用 RIGHT 分区函数时,第一个值将作为第二个分区的下边界*/


    2. 添加文件组和文件
        针对所创建的分区来创建文件组和文件,我们可以创建五个文件组,五个不同的ndf文件来存放不同年份的orders,可以放置于不同的磁盘来减少I/O的开销,也可以在一个文件组中创建多个文件来存放不同年份的orders,本例创建了四个文件组,其中有一年的orders放置到了Primary组中。


alter database Performance
add filegroup [FG1];
go
alter database Performance
add filegroup [FG2];
go
alter database Performance
add filegroup [FG3];
go
alter database Performance
add filegroup [FG4];
go
alter database Performance
add file
(name = FG1_data,filename = 'D:\SQL_Data\Performance\FG1_data.ndf',size = 3MB)
to filegroup [FG1];
alter database Performance
add file
(name = FG2_data,filename = 'D:\SQL_Data\Performance\FG2_data.ndf',size = 3MB)
to filegroup [FG2];
alter database Performance
add file
(name = FG3_data,filename = 'D:\SQL_Data\Performance\FG3_data.ndf',size = 3MB)
to filegroup [FG3];
alter database Performance
add file
(name = FG4_data,filename = 'D:\SQL_Data\Performance\FG4_data.ndf',size = 3MB)
to filegroup [FG4];
go


    3. 创建分区架构并关联到分区函数


Create partition scheme Part_func_orders_scheme
as partition Part_func_orders
to ([FG1],[FG2],[FG3],[FG4],[Primary]);
go


    4.重建索引(删除聚集索引以及需要分区字段的索引后重建该类索引,表被按分区值将分配到各文件组)


EXEC sp_helpindex N'orders' --查看orders中使用的索引
drop index idx_cl_od
on orders;
go
create clustered index idx_cl_od
on orders(orderdate)

on Part_func_orders_scheme(orderdate);
go

    5. 查看分区的相关情况


--查看分区及分区范围的情况
select * from sys.partitions where object_id = object_id('orders');
select * from sys.partition_range_values;


--查看分区架构情况
select * from sys.partition_schemes;


--查看某一特定分区列值属于哪个分区
select Performance.$partition.Part_func_orders('20050325') as partition_num;


--查看某一特定分区的记录
select * from orders where Performance.$partition.Part_func_orders(orderdate) = 2


--查看各分区所包含的记录数
select $partition.Part_func_orders(orderdate) as partition_num,
  count(*) as record_num
from orders
group by $partition.Part_func_orders(orderdate)
order by $partition.Part_func_orders(orderdate);
 

    6.分区的管理


--增加分区值,增加分区之前应先增加或设置新分区使用的文件组
alter database Performance
add filegroup [FG5];
go


alter database Performance
add file
(name = FG5_data,filename = 'D:\SQL_Data\Performance\FG5_data.ndf',size = 3MB )
to filegroup [FG5];
go


alter partition scheme Part_func_orders_scheme
next used [FG5];
go

alter partition function Part_func_orders()
split range('20061231 23:59:59.997')
go

insert into orders
select 10000001,'C0000012906',213,'I','20070101','a'
union all select 10000002,'C0000019995',213,'I','20070109','a'
union all select 10000003,'C0000019996',410,'I','20070512','a';
go

select * from orders where Performance.$partition.Part_func_orders(orderdate) = 6


--合并分区
--合并分区后,以下将新增的三条记录放到了第5个分区中


alter partition function Part_func_orders()
merge range('20061231 23:59:59.997');
go

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/robinson_0612/archive/2009/11/07/4783702.aspx

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载