SQL Server数据归档的解决方案
最近新接到的一項(xiàng)工作是把SQL Server中保存了四五年的陳年數(shù)據(jù)(合同,付款,報(bào)銷(xiāo)等等單據(jù))進(jìn)行歸檔,原因是每天的數(shù)據(jù)增量很大,而歷史數(shù)據(jù)又不經(jīng)常使用,影響生產(chǎn)環(huán)境的數(shù)據(jù)查詢(xún)等操作。要求是:
1 歸檔的數(shù)據(jù)與生產(chǎn)環(huán)境數(shù)據(jù)分開(kāi)保存,以便提高查詢(xún)效率和服務(wù)器性能。
2 前端用戶(hù)能夠查詢(xún)已歸檔的數(shù)據(jù),即系統(tǒng)提供的功能不能發(fā)生改變
看起來(lái)要求不是很高,我自然會(huì)聯(lián)想到兩種方法,第一種新建一個(gè)與生產(chǎn)環(huán)境一樣的數(shù)據(jù)庫(kù),把歸檔數(shù)據(jù)保存到這個(gè)數(shù)據(jù)庫(kù)中;第二種在生產(chǎn)環(huán)境為每個(gè)表創(chuàng)建一個(gè)后綴為_(kāi)Archive的表,例如Invoice,? 那么就要?jiǎng)?chuàng)建一個(gè)Invoice_Archive表示存放歸檔的數(shù)據(jù)表。這兩種方法可以用跨數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)或視圖的方式,解決數(shù)據(jù)查詢(xún)等需求。仔細(xì)分析后,弊端是需要對(duì)現(xiàn)行系統(tǒng)進(jìn)行改造,即需要修改代碼,以便適應(yīng)對(duì)歸檔數(shù)據(jù)的訪(fǎng)問(wèn),實(shí)際也把數(shù)據(jù)訪(fǎng)問(wèn)和業(yè)務(wù)操作給藕荷了,是一個(gè)費(fèi)力又不討好的解決方法。
有沒(méi)有一種方法可以不修改系統(tǒng)能夠透明的訪(fǎng)問(wèn)生產(chǎn)數(shù)據(jù)和歸檔數(shù)據(jù)呢?當(dāng)然是有的,就是SQL Server提供的分區(qū)表。
在這里就不累贅復(fù)述分區(qū)表的定義和作用了,要想精通就要認(rèn)真讀微軟官方文檔:SQL Server 2005 中的分區(qū)表和索引。我濃縮的作用就是,通過(guò)使用分區(qū)表可以將數(shù)據(jù)表分割到不用的磁盤(pán)文件中,不同的磁盤(pán)就意味著性能的提升,因?yàn)閮蓚€(gè)磁頭讀取數(shù)據(jù)當(dāng)然要比一個(gè)磁頭讀取數(shù)據(jù)快了,然后用戶(hù)可以透明地根據(jù)不同的訪(fǎng)問(wèn)方式選取數(shù)據(jù)。舉個(gè)例子:一個(gè)合同表,有個(gè)字段Archived標(biāo)識(shí)是否歸檔(0代表未歸檔,1代表已歸檔),我們可以用分區(qū)表的方式,將合同表分成兩個(gè)表分別保存在不同的磁盤(pán),例如c和d, 當(dāng)我們將一個(gè)合同設(shè)置為已歸檔,這條記錄就會(huì)從c盤(pán)轉(zhuǎn)到d盤(pán),平時(shí)我們只查詢(xún)未歸檔的記錄,如果要查已歸檔的記錄,也只需要select * from Contracts where Archived = 1這么簡(jiǎn)單,即透明的查詢(xún),具體的實(shí)現(xiàn)我們不用關(guān)心。
好了,不能光說(shuō)不練,就驗(yàn)證一下。創(chuàng)建兩個(gè)文件目錄
創(chuàng)建一個(gè)測(cè)試數(shù)據(jù)庫(kù)
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?查看數(shù)據(jù)屬性,有點(diǎn)不一樣
打開(kāi)數(shù)據(jù):
use?TestDB新建分區(qū)函數(shù),參數(shù)類(lèi)型是bit,即已歸檔的數(shù)據(jù)
Create?Partition?Function?TestDB_ArchivePartitionRange(bit)?AS?RANGE?right?FOR?VALUES(1)新建一個(gè)分區(qū)方案,即已經(jīng)歸檔的數(shù)據(jù)保存到TestDB_Part2分區(qū)文件上
CREATE?Partition?Scheme?TestDB_ArchivePatitionScheme?AS?PARTITION?TestDB_ArchivePartitionRangeTO?([PRIMARY],?TestDB_Part2);創(chuàng)建一個(gè)測(cè)試數(shù)據(jù)表,綁定一個(gè)分區(qū)方案
CREATE?TABLE?TestArchiveTable? (Archived?Bit?NOT?NULL,?Date?DATETIME)?ON?TestDB_ArchivePatitionScheme?(Archived)插入一些新的數(shù)據(jù),已供測(cè)試
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');?先來(lái)一個(gè)普通查詢(xún)
看看每個(gè)分區(qū)表存放數(shù)據(jù)的情況,分區(qū)一有3條記錄,分區(qū)2沒(méi)有記錄,即沒(méi)有歸檔數(shù)據(jù)
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';?結(jié)果就是我們想要的。
總結(jié):利用分區(qū)表不僅能大幅提升數(shù)據(jù)訪(fǎng)問(wèn)性能,而且可以根據(jù)需要分別存儲(chǔ)數(shù)據(jù)到不同的文件,方便我們有效地利用數(shù)據(jù),簡(jiǎn)化系統(tǒng)開(kāi)發(fā)的復(fù)雜性。
https://www.cnblogs.com/qq260250932/p/5479037.html
總結(jié)
以上是生活随笔為你收集整理的SQL Server数据归档的解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前世情迷在线观看(前世情迷)
- 下一篇: 复合函数(说一说复合函数的简介)