SQL Server数据归档的解决方案

  最近新接到的一项工作是把SQL Server中保存了四五年的陈年数据(合同,付款,报销等等单据)进行归档,原因是每天的数据增量很大,而历史数据又不经常使用,影响生产环境的数据查询等操作。要求是:

 

  1 归档的数据与生产环境数据分开保存,以便提高查询效率和服务器性能。

  2 前端用户能够查询已归档的数据,即系统提供的功能不能发生改变

 

  看起来要求不是很高,我自然会联想到两种方法,第一种新建一个与生产环境一样的数据库,把归档数据保存到这个数据库中;第二种在生产环境为每个表创建一个后缀为_Archive的表,例如Invoice,  那么就要创建一个Invoice_Archive表示存放归档的数据表。这两种方法可以用跨数据库访问或视图的方式,解决数据查询等需求。仔细分析后,弊端是需要对现行系统进行改造,即需要修改代码,以便适应对归档数据的访问,实际也把数据访问和业务操作给藕荷了,是一个费力又不讨好的解决方法。

 

  有没有一种方法可以不修改系统能够透明的访问生产数据和归档数据呢?当然是有的,就是SQL Server提供的分区表。

  在这里就不累赘复述分区表的定义和作用了,要想精通就要认真读微软官方文档:SQL Server 2005 中的分区表和索引。我浓缩的作用就是,通过使用分区表可以将数据表分割到不用的磁盘文件中,不同的磁盘就意味着性能的提升,因为两个磁头读取数据当然要比一个磁头读取数据快了,然后用户可以透明地根据不同的访问方式选取数据。举个例子:一个合同表,有个字段Archived标识是否归档(0代表未归档,1代表已归档),我们可以用分区表的方式,将合同表分成两个表分别保存在不同的磁盘,例如c和d, 当我们将一个合同设置为已归档,这条记录就会从c盘转到d盘,平时我们只查询未归档的记录,如果要查已归档的记录,也只需要select * from Contracts where Archived = 1这么简单,即透明的查询,具体的实现我们不用关心。

 

好了,不能光说不练,就验证一下。创建两个文件目录

  

创建一个测试数据库

USE  Master;
GO
IF   EXISTS  (
SELECT  name
FROM  sys.databases
WHERE  name  =  N ' TestDB ' )
DROP   DATABASE  TestDB;
GO
CREATE   DATABASE  TestDB
ON   PRIMARY
(NAME
= ' TestDB_Part1 ' ,
FILENAME
=
' D:\TestData\Primary\TestDB_Part1.mdf ' ,
SIZE
= 10 ,
MAXSIZE
= 100 ,
FILEGROWTH
= 1  ),
FILEGROUP TestDB_Part2
(NAME 
=   ' TestDB_Part2 ' ,
FILENAME 
=
' D:\TestData\Secondary\TestDB_Part2.ndf ' ,
SIZE 
=   10 ,
MAXSIZE
= 100 ,
FILEGROWTH
= 1  );
GO

 查看数据属性,有点不一样

打开数据:

use  TestDB

 

新建分区函数,参数类型是bit,即已归档的数据

Create  Partition  Function  TestDB_ArchivePartitionRange( bit )
AS  RANGE  right   FOR
VALUES ( 1 )

 

新建一个分区方案,即已经归档的数据保存到TestDB_Part2分区文件上

CREATE  Partition Scheme TestDB_ArchivePatitionScheme
AS  PARTITION TestDB_ArchivePartitionRange
TO  ( [ PRIMARY ] , TestDB_Part2);

 

创建一个测试数据表,绑定一个分区方案

CREATE   TABLE  TestArchiveTable 
(Archived 
Bit   NOT   NULL , Date  DATETIME
ON  TestDB_ArchivePatitionScheme (Archived)

 

插入一些新的数据,已供测试

INSERT   INTO  TestArchiveTable (Archived, Date)   VALUES  ( 0 , ' 2011-01-01 ' ); 
INSERT   INTO  TestArchiveTable (Archived, Date)   VALUES  ( 0 , ' 2011-02-01 ' ); 
INSERT   INTO  TestArchiveTable (Archived, Date)   VALUES  ( 0 , ' 2011-03-01 ' ); 

 

先来一个普通查询

 

看看每个分区表存放数据的情况,分区一有3条记录,分区2没有记录,即没有归档数据

SELECT   *   FROM  sys.partitions 
WHERE   OBJECT_NAME ( OBJECT_ID ) = ' TestArchiveTable '

 

好了,我们归档一条记录看看

update  TestArchiveTable   set  Archived  =   1   where  Date  =   ' 2011-03-01 '  
SELECT   *   FROM  sys.partitions 
WHERE   OBJECT_NAME ( OBJECT_ID ) = ' TestArchiveTable '

 

结果就是我们想要的。

 

总结:利用分区表不仅能大幅提升数据访问性能,而且可以根据需要分别存储数据到不同的文件,方便我们有效地利用数据,简化系统开发的复杂性。

转载于:https://www.cnblogs.com/zwx/archive/2011/04/01/2002043.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值