Partitioned Table可伸缩性表分区功能

可伸缩性性是数据库管理系统的一个很重要的方面,在SQL Server 2005中可伸缩性方面提供了表分区功能。

其实对于有关系弄数据库产品来说,对表、数据库和服务器进行数据分区的从而提供大数据量的支持并不是什么新鲜事,但 SQL Server 2005 提供了一个新的体系结构功能,用于对数据库中的文件组进行表分区。水平分区可根据分区架构,将一个表划分为几个较小的分组。表分区功能是针对超大型数据库(从数百吉字节到数千吉字节或更大)而设计的。超大型数据库 (VLDB) 查询性能通过分区得到了改善。通过对广大分区列值进行分区,可以对数据的子集进行管理,并将其快速、高效地重新分配给其他表。

设想一个大致的电子交易网站,有一个表存储了此网站的历史交易数据,这此数据量可能有上亿条,在以前的SQL Server版本中存储在一个表中不管对于查询性能还是维护都是件麻烦事,下面我们来看一下在SQL Server2005怎么提高性能和可管理性:

 

None.gif --  创建要使用的测试数据库,Demo
None.gif
None.gif 
None.gif
None.gifUSE [master]
None.gif
None.gifIF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name 
=  N ' DEMO ' )
None.gif
None.gifDROP DATABASE [DEMO]
None.gif
None.gif 
None.gif
None.gifCREATE DATABASE [DEMO]
None.gif
None.gif
-- 由于表分区使用使用新的体系结构,使用文件组来进行表分区,所以我们创建将要用到的6个文件组,来存储6个时间段的交易数据[ < 2000 ],[  2001 ], [ 2002 ], [ 2003 ], [ 2004 ], [ > 2005 ]
None.gif
None.gifALTER DATABASE Demo ADD FILEGROUP YEARFG1;
None.gif
None.gifALTER DATABASE Demo ADD FILEGROUP YEARFG2;
None.gif
None.gifALTER DATABASE Demo ADD FILEGROUP YEARFG3;
None.gif
None.gifALTER DATABASE Demo ADD FILEGROUP YEARFG4;
None.gif
None.gifALTER DATABASE Demo ADD FILEGROUP YEARFG5; 
None.gif
None.gifALTER DATABASE Demo ADD FILEGROUP YEARFG6; 
None.gif
None.gif 
None.gif
None.gif
--  下面为这些文件组添加文件来进行物理的数据存储
None.gif
None.gifALTER DATABASE Demo ADD FILE (NAME 
=   ' YEARF1 ' , FILENAME  =   ' C:\ADVWORKSF1.NDF ' ) TO FILEGROUP YEARFG1;
None.gif
None.gifALTER DATABASE Demo ADD FILE (NAME 
=   ' YEARF2 ' , FILENAME  =   ' C:\ADVWORKSF2.NDF ' ) TO FILEGROUP YEARFG2;
None.gif
None.gifALTER DATABASE Demo ADD FILE (NAME 
=   ' YEARF3 ' , FILENAME  =   ' C:\ADVWORKSF3.NDF ' ) TO FILEGROUP YEARFG3;
None.gif
None.gifALTER DATABASE Demo ADD FILE (NAME 
=   ' YEARF4 ' , FILENAME  =   ' C:\ADVWORKSF4.NDF ' ) TO FILEGROUP YEARFG4;
None.gif
None.gifALTER DATABASE Demo ADD FILE (NAME 
=   ' YEARF5 ' , FILENAME  =   ' C:\ADVWORKSF5.NDF ' ) TO FILEGROUP YEARFG5;
None.gif
None.gifALTER DATABASE Demo ADD FILE (NAME 
=   ' YEARF6 ' , FILENAME  =   ' C:\ADVWORKSF6.NDF ' ) TO FILEGROUP YEARFG6;
None.gif
None.gif
--  HERE WE ASSOCIATE THE PARTITION FUNCTION TO 
None.gif
None.gif
--  THE CREATED FILEGROUP VIA A PARTITIONING SCHEME
None.gif
None.gifUSE DEMO;
None.gif
None.gifGO
None.gif
None.gif 
None.gif
None.gif
-------------------------------------------------------
None.gif
None.gif
--  创建分区函数
None.gif
None.gif
-------------------------------------------------------
None.gif
None.gifCREATE PARTITION FUNCTION YEARPF(datetime)
None.gif
None.gifAS 
None.gif
None.gifRANGE LEFT FOR VALUES (
' 01/01/2000 '
None.gif
None.gif                                          ,
' 01/01/2001 '
None.gif
None.gif                                          ,
' 01/01/2002 '
None.gif
None.gif                                          ,
' 01/01/2003 '
None.gif
None.gif                                          ,
' 01/01/2004 ' )
None.gif
None.gif
-------------------------------------------------------
None.gif
None.gif
--  创建分区架构
None.gif
None.gif
-------------------------------------------------------
None.gif
None.gifCREATE PARTITION SCHEME YEARPS
None.gif
None.gifAS PARTITION YEARPF TO (YEARFG1, YEARFG2,YEARFG3,YEARFG4,YEARFG5,YEARFG6)
None.gif
None.gif 
None.gif
None.gif
--  创建使用此Schema的表
None.gif
None.gifCREATE TABLE PARTITIONEDORDERS
None.gif
None.gif(
None.gif
None.gifID INT NOT NULL IDENTITY(
1 , 1 ),
None.gif
None.gifDUEDATE DATETIME NOT NULL,
None.gif
None.gif) ON YEARPS(DUEDATE)
None.gif
None.gif 
None.gif
None.gif
-- 为此表填充数据
None.gif
None.gifdeclare @DT datetime
None.gif
None.gifSELECT @DT 
=   ' 1999-01-01 '
None.gif
None.gif 
None.gif
None.gif
-- start looping, stop at ending date
None.gif
None.gifWHILE (@DT 
<=   ' 2005-12-21 ' )
None.gif
None.gifBEGIN
None.gif
None.gif       INSERT INTO PARTITIONEDORDERS VALUES(@DT) 
None.gif
None.gif       SET @DT
= dateadd(yy, 1 ,@DT)
None.gif
None.gifEND
None.gif
None.gif 
None.gif
None.gif
--  现在我们可以看一下我们刚才插入的行都分布在哪个Partition 
None.gif
None.gifSELECT 
* , $PARTITION.YEARPF(DUEDATE) FROM PARTITIONEDORDERS
None.gif
None.gif
None.gif
None.gif
-- 我们可以看一下我们现在PARTITIONEDORDERS表的数据存储在哪此partition中,以及在这些分区中数据量的分布
None.gif
None.gifSELECT 
*  FROM SYS.PARTITIONS WHERE OBJECT_ID  =  OBJECT_ID( ' PARTITIONEDORDERS ' )
None.gif
None.gif
None.gif
None.gif
--
None.gif
None.gif
-- 现在我们设想一下,如果我们随着时间的流逝,现在已经到了2005年,按照我们先前的设定,我们想再想入一个分区,这时是不是重新创建表分区架构然后重新把数据导放到新的分区架构呢,答案是完全不用。下面我们就看如果新加一个分区。
None.gif
None.gif
-- 更改分区架构定义语言,让下一个分区使用和现在已经存在的分区YEARFG6分区中,这样此分区就存储了两段partition的数据。
None.gif
None.gifALTER PARTITION SCHEME YEARPS
None.gif
None.gifNEXT USED YEARFG6;
None.gif
None.gif 
None.gif
None.gif
-- 更改分区函数
None.gif
None.gifALTER PARTITION FUNCTION YEARPF()
None.gif
None.gifSPLIT RANGE (
' 01/01/2005 '
None.gif
None.gif 
None.gif
None.gif
-- 现在我们可以看一下我们刚才插入的行都分布在哪个Partition?
None.gif
None.gifSELECT 
* , $PARTITION.YEARPF(DUEDATE) FROM PARTITIONEDORDERS
None.gif
None.gif
None.gif
None.gif
-- 我们可以看一下我们现在PARTITIONEDORDERS表的数据存储在哪此partition中,以及在这些分区中数据量的分布
None.gif
None.gifSELECT 
*  FROM SYS.PARTITIONS WHERE OBJECT_ID  =  OBJECT_ID( ' PARTITIONEDORDERS ' )
None.gif
None.gif
None.gif 
None.gif
posted on 2007-07-23 09:40 方正 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/linckle/archive/2007/07/23/827842.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值