SqlServer2005基于已有表创建分区

      

随着当今数据库的容量越来越快的朝着在大型数据库或超大型数据库的发展,对于数据库中的大

型表以及具有各种访问模式的表的可伸缩性和可管理性运行环境变得尤为重要,

SQL server

SQL 

server 7.0

的分区视图到

SQL server 2000

中的分区视图中到

SQL server 2005

所使用的分区表,

不断改

善大型表所面临的性能、阻塞、备份空间、时间、运营成本等。当表和索引非常大的时候,通过分区

表的实现,可以将数据分为更小,更易于管理,获得更好的可操作性能。本实验介绍基于已存在的表

来如何创建分区,管理分区。

 

 

一、实验目的:对于已经存在的表且不断增大的情况下构建分区表,管理分区表,提高其性能。

 

 

二、主要步骤:对于已经存在的表,我们可以采取以下步骤来对其创建分区表

 

    

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

SqlServer2005基于已有表创建分区

上一篇:RandomAccessFile类


下一篇:SQL_求集合中每天最大时间记录的总和