如何创建修改分区表和如何查看分区表

 

SQL Server 2005是微软在推出SQL Server 2000后时隔五年推出的一个数据库平台,它的数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使用户可以构建和管理用于业务的高可用和高性能的数据应用程序。此外SQL Server 2005结合了分析、报表、集成和通知功能。这使企业可以构建和部署经济有效的BI解决方案,帮助团队通过记分卡、Dashboard、Web Services和移动设备将数据应用推向业务的各个领域。无论是开发人员、数据库管理员、信息工作者还是决策者,SQL Server 2005都可以提供出创新的解决方案,并可从数据中获得更多的益处。

    它所带来的新特性,如T-SQL的增强、数据分区、服务代理和与.Net Framework的集成等,在易管理性、可用性、可伸缩性和安全性等方面都有很大的增强。

    SQL Server 2005表分区的具体实现方法

    表分区分为水平分区和垂直分区。水平分区将表分为多个表。每个表包含的列数相同,但是行更少。例如,可以将一个包含十亿行的表水平分区成 12 个表,每个小表表示特定年份内一个月的数据。任何需要特定月份数据的查询只需引用相应月份的表。而垂直分区则是将原始表分成多个只包含较少列的表。水平分区是最常用分区方式,本文以水平分区来介绍具体实现方法。

    水平分区常用的方法是根据时期和使用对数据进行水平分区。例如本文例子,一个短信发送记录表包含最近一年的数据,但是只定期访问本季度的数据。在这种情况下,可考虑将数据分成四个区,每个区只包含一个季度的数据。

    创建文件组

    建立分区表先要创建文件组,而创建多个文件组主要是为了获得好的 I/O 平衡。一般情况下,文件组数最好与分区数相同,并且这些文件组通常位于不同的磁盘上。每个文件组可以由一个或多个文件构成,而每个分区必须映射到一个文件组。一个文件组可以由多个分区使用。为了更好地管理数据(例如,为了获得更精确的备份控制),对分区表应进行设计,以便只有相关数据或逻辑分组的数据位于同一个文件组中。使用 ALTER DATABASE,添加逻辑文件组名:

    ALTER DATABASE [DeanDB] ADD FILEGROUP [FG1]

    DeanDB为数据库名称,FG1文件组名。创建文件组后,再使用 ALTER DATABASE 将文件添加到该文件组中:

    ALTER DATABASE [DeanDB] ADD FILE ( NAME = N''FG1'', FILENAME = N''C:DeanDataFG1.ndf'' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [FG1]

    类似的建立四个文件和文件组,并把每一个存储数据的文件放在不同的磁盘驱动器里。

    创建分区函数

    创建分区表必须先确定分区的功能机制,表进行分区的标准是通过分区函数来决定的。创建数据分区函数有RANGE “LEFT | / RIGHT”两种选择。代表每个边界值在局部的哪一边。例如存在四个分区,则定义三个边界点值,并指定每个值是第一个分区的上边界 (LEFT) 还是第二个分区的下边界 (RIGHT)[1]。代码如下:

    CREATE PARTITION FUNCTION [SendSMSPF](datetime) AS RANGE RIGHT FOR VALUES (''20070401'', ''20070701'', ''20071001'')

    创建分区方案

    创建分区函数后,必须将其与分区方案相关联,以便将分区指向至特定的文件组。就是定义实际存放数据的媒体与各数据块的对应关系。多个数据表可以共用相同的数据分区函数,一般不共用相同的数据分区方案。可以通过不同的分区方案,使用相同的分区函数,使不同的数据表有相同的分区条件,但存放在不同的媒介上。创建分区方案的代码如下:

    CREATE PARTITION SCHEME [SendSMSPS] AS PARTITION [SendSMSPF] TO ([FG1], [FG2], [FG3], [FG4])

    创建分区表

    建立好分区函数和分区方案后,就可以创建分区表了。分区表是通过定义分区键值和分区方案相联系的。插入记录时,SQL SERVER会根据分区键值的不同,通过分区函数的定义将数据放到相应的分区。从而把分区函数、分区方案和分区表三者有机的结合起来。创建分区表的代码如下:

  CREATE TABLE SendSMSLog

  ([ID] [int] IDENTITY(1,1) NOT NULL,

  [IDNum] [nvarchar](50) NULL,

  [SendContent] [text] NULL

  [SendDate] [datetime] NOT NULL,

  ) ON SendSMSPS(SendDate)

    查看分区表信息

    系统运行一段时间或者把以前的数据导入分区表后,我们需要查看数据的具体存储情况,即每个分区存取的记录数,那些记录存取在那个分区等。我们可以通过$partition.SendSMSPF来查看,代码如下:

  SELECT $partition.SendSMSPF(o.SendDate)

  AS [Partition Number]

  , min(o.SendDate) AS [Min SendDate]

  , max(o.SendDate) AS [Max SendDate]

  , count(*) AS [Rows In Partition]

  FROM dbo.SendSMSLog AS o

  GROUP BY $partition.SendSMSPF(o.SendDate)

  ORDER BY [Partition Number]  

    维护分区

    分区的维护主要设计分区的添加、减少、合并和在分区间转换。可以通过ALTER PARTITION FUNCTION的选项SPLIT,MERGE和ALTER TABLE的选项SWITCH来实现。SPLIT会多增加一个分区,而MEGRE会合并或者减少分区,SWITCH则是逻辑地在组间转换分区。

    性能对比

    我们对2650万数据,存储空间占用约4G的单表进行性能对比,测试环境为IBM365,CPU 至强2.7G*2、内存 16G、硬盘 136G*2,系统平台为Windows 2003 SP1+SQL Server 2005 SP1。测试结果如表1:

  表1:分区和未分区性能对比表(单位:毫秒)

  测试项目 分区 未分区

  1 16546 61466

  2 13 33

  3 20140 61546

  4 17140 61000

  说明:

  1:根据时间检索某一天记录所耗时间

  2:单条记录插入所耗时间

  3:根据时间删除某一天记录所耗时间

  4:统计每月的记录数所需时间

    从表1可以看出,对分区表进行操作比未分区的表要快,这是因为对分区表的操作采用了CPU和I/O的并行操作,检索数据的数据量也变小了,定位数据所耗时间变短。

 

 

----------------------------------------------------------------

两天一直在研究2005 中如何对表进行分区,但是参考了多数资料都是说新建表后再将原表中数据插入到新表中,这样有些不方便.今天发现了如何更改表文件组的所在文件组,然后看了看.会不会也能应用到分区表中..试了试嗯.不错...真的管用哦.下面看看代码

说明 现有表 myTb 主键索引 PK_myTb.
原理 更改表的聚集索引的所在文件组使得表移动到新的"文件组中(这里我们用表分区)".
先创建文件组,以及分区函数等请参考http://hi.baidu.com/bg1jt/blog/item/ad3b6a631ad73a640d33fa4e.html 我的这篇文章.

然后将创建表部分替换成
alter table myTb drop constraint PK_myTb--删除现有表的主键(对有全文索引的只能再管理器中去除主键)
ALTER TABLE [dbo].[fabu] WITH NOCHECK ADD 
CONSTRAINT [PK_fabu] PRIMARY KEY CLUSTERED 
(
[id]--注意ID这里是你原来的那些主键组成的列
) ON [ps_Product_Scheme_mTb]([id])--将主键创建到ps_Product_Scheme_mTb分区函数上
用下面这条语句看看分区是不是已经改变了?
SELECT *, $PARTITION.pf_Product_fabu(ID) AS PF FROM myTb

这样的好处在于不用新建表.这样就像本人那种表的ID在多个表中作为参考的从新建表其他信息将无用..
弊端-这样对有全文索引的表必须从新建立全文索引..

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实例

 

/*
本文使对现有的数据库中新建一个表进行分区.暂未发现如何对一个已有数据
的表进行分区处理的资料.本文事例仅为本人测试用.其中有很多未考虑之处
和错误,还请大家赐教. 
转载请保留此信息 来自
http://user.qzone.qq.com/149651816 作者:BG1JT
*/
--创建文件组
/*
为数据库[Mydb]添加4个文件组
*/

ALTER DATABASE Mydb ADD FILEGROUP [MydbSF1]
ALTER DATABASE Mydb
ADD FILE 
(NAME ='MydbSF1',
FILENAME = 'D:/db/fabuTb/1/MydbSF1.ndf',
FILEGROWTH=1,
MAXSIZE = UNLIMITED
)TO FILEGROUP 

ALTER DATABASE Mydb ADD FILEGROUP [MydbSF2]
ALTER DATABASE Mydb
ADD FILE 
(NAME = N'MydbSF2',
FILENAME = 'D:/db/fabuTb/2/MydbSF2.ndf',
FILEGROWTH=1,
MAXSIZE = UNLIMITED)
TO FILEGROUP 

ALTER DATABASE Mydb ADD FILEGROUP [MydbSF3]
ALTER DATABASE Mydb
ADD FILE 
(NAME = N'MydbSF3',
FILENAME = N'D:/db/fabuTb/3/MydbSF3.ndf',
FILEGROWTH=1,
MAXSIZE = UNLIMITED)
TO FILEGROUP 

ALTER DATABASE Mydb ADD FILEGROUP [MydbSF4]
ALTER DATABASE Mydb
ADD FILE
(NAME = N'MydbSF4',
FILENAME = N'D:/db/fabuTb/4/MydbSF4.ndf',
FILEGROWTH=1,
MAXSIZE = UNLIMITED)
TO FILEGROUP [MydbSF4]
/*
添加文件组结束
*/

--创建分区函数
/*
以数据库表中ID为参考,此处是以1~10,11~20,
21~30,31~&做为4个表分区的界限
*/
CREATE PARTITION FUNCTION pf_Product_Sell (int)
AS RANGE RIGHT FOR VALUES (10, 20, 30)

/*
将分区界限分别放入4个不同的文件组中
*/
CREATE PARTITION SCHEME [ps_Product_SchemeSell] AS PARTITION
pf_Product_fabu TO (MydbSF1,MydbSF2,MydbSF3,MydbSF4)

--创建表(在文件组的表分区上)
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Sell](
[id] [int] IDENTITY(1,1) NOT NULL,
[userid] [int] NOT NULL
CONSTRAINT [PK_Sell] PRIMARY KEY CLUSTERED 
(
[id] ASC
)WITH (PAD_INDEX   = OFF, STATISTICS_NORECOMPUTE   = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS   = ON, ALLOW_PAGE_LOCKS   = ON) ON [ps_Product_SchemeSell]([id])
)

/*
然后大家可以插入数据...
然后用下面的那个查询语句查看PF中的值
是否已经吧不同数据放在不同的分区中了
*/

SELECT *, $PARTITION.[pf_Product_Sell](ID) AS PF
FROM sell

/*
需要注意的在创建分组文件的时候.必须设置自动增长
并且不要最大值设置为不限,否则在插入数据的时候回
出现错误.
*/


这样处理的时候像上10G以上单表的数据操作不必每次操作超大的数据库文件了.
而且对 I/O 物理磁盘的瓶颈能有效的减轻.

SQL 2005 更多功能继续发觉中

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值