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=,
MAXSIZE=,
FILEGROWTH= ),
FILEGROUP TestDB_Part2
(NAME = 'TestDB_Part2',
FILENAME =
'D:\TestData\Secondary\TestDB_Part2.ndf',
SIZE = ,
MAXSIZE=,
FILEGROWTH= );
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'; 

结果就是我们想要的。

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

SQL Server数据归档的解决方案的更多相关文章

  1. C#向sql server数据表添加数据源代码

    HoverTree解决方案 学习C#.NET,Sql Server,WinForm等的解决方案. 本文链接http://hovertree.com/h/bjaf/0jteg8cv.htm 使用的技术. ...

  2. 推荐图书-《SQL Server 2008商业智能完美解决方案》

    内容简介 <SQL Server 2008商业智能完美解决方案>介绍如何使用Microsoft SQL Server 2008开发商业智能(BI)解决方案.<SQL Server 2 ...

  3. SQL Server 2008R2 18456错误解决方案

    SQL Server 2008R2 18456错误解决方案 微软解释说,因密码或用户名错误而使身份验证失败并导致连接尝试被拒时,类似下面的消息将返回到客户端:“用户 '<user_name> ...

  4. Docker-compose搭建ELK环境并同步MS SQL Server数据

    前言 本文作为学习记录,供大家参考:一次使用阿里云(Aliyun)1核2G centos7.5 云主机搭建Docker下的ELK环境,并导入MS SQL Server的商品数据以供Kibana展示的配 ...

  5. SQL server数据缓存依赖

    SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1  轮询模式实现步骤 此模式需要SQL SERVER 7.0/2000/2005版本以上版本都支持        主要包含以下几 ...

  6. [SQL]SQL Server数据表的基础知识与增查删改

    SQL Server数据表的基础知识与增查删改 由张晨辉(学生) 于19天 前发表 | 阅读94次 一.常用数据类型 .整型:bigint.int.smallint.tinyint .小数:decim ...

  7. Sql Server数据的加密与解密

    Sql Server数据的加密与解密 在sql server中,我们如何为数据进行加密与解密,避免使用者窃取机密数据? 对于一些敏感数据,如密码.卡号,一般不能使用正常数值来存储.否则会有安全隐患.以 ...

  8. delphi 2010 导出sql server 数据到DBF乱码问题

    近日,由于业务需要导出sql server 数据到DBF文件,要查询多表记录,并适当处理后生成导出DBF文件,系统使用delphi2010平台开发. 首先按要求在VFP里创建DBF表,字段数有240个 ...

  9. SQL server数据库内置账户SA登录设置

    SQL server数据库内置账户SA登录不了   设置SQL Server数据库给sa设置密码的时候  提示18456 解决步骤:   第二步:右击sa,选择属性: 第三步:点击状态选项卡:勾选授予 ...

随机推荐

  1. [Database.System.Concepts(6th.Edition.2010)].Abraham.Silberschatz. Ch8学习笔记

    Database Ch8.relational design 8.1 features of good design 8.1.1 larger alternatives why design is g ...

  2. 目标检测(一)RCNN--Rich feature hierarchies for accurate object detection and semantic segmentation(v5)

    作者:Ross Girshick,Jeff Donahue,Trevor Darrell,Jitendra Malik 该论文提出了一种简单且可扩展的检测算法,在VOC2012数据集上取得的mAP比当 ...

  3. 【Python全栈】HTML <!--...--> 注释 、CSS/JS //注释 和 /*.....*/ 注释

    HTML <!--...--> 注释 .CSS/JS //注释 和 /*.....*/ 注释 <!-- -->是HTML的注释标签,使用 < 和 > 是符合HTML ...

  4. MSMQ 跨服务器读写队列的“消息队列系统的访问被拒绝”的解决方案

    转自https://www.cnblogs.com/jyz/articles/4612333.html 最近项目中需要跨服务器对消息队列进行读写,开始在单独开发机器上进行Queue的读写没问题.但是部 ...

  5. 5、jeecg 笔记之 minidao 条件判断

    1.前言  我们知道 mybatis 中的动态sql语句是基于 OGNL 表达式的.  额外补充一点:mybatis 中的 #{} 和 ${} ,可直接跳过.   #{}表示一个占位符号,#{}接收输 ...

  6. python基础之 数据类型的补充,小数据类型

    1.id is详解 ID 在Python中,id是什么?id是内存地址,比如你利用id()内置函数去查询一个数据的内存地址: name = 'nba' print(id(name)) # 158583 ...

  7. 用git如何把单个文件回退到某一版本

    暂定此文件为a.jsp 1.首先到a.jsp所在目录: 通过 git  log a.jsp 查看a.jsp的更改记录 2.找到想要回退的版本号:例如 fcd2093 通过 git reset  fcd ...

  8. 2018-2019-1 20189203《Linux内核原理与分析》第五周作业

    第一部分 课本学习 用户态.内核态和中断 1.内核态:处于高的执行级别下,代码可以执行特权指令,访问任意的物理地址,这时的CPU就对应内核态,对所有的指令包括特权指令都可以执行. 2.用户态:处于低的 ...

  9. 面向对象编程之OC

    面向对象概述 面向对象是一种符合人类思想习惯的编程思想.现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系,在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种 ...

  10. manjaro使用国内软件源

    虽然manjaro是基于arch修改的,但毕竟还是有些改动,如果可以用manjaro仓库里的,尽量不要用arch的源.如果嫌官方的软件源慢,可以直接一条命令修改成国内的软件源 sudo pacman- ...