日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL Server数据归档的解决方案

發(fā)布時間:2024/9/20 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server数据归档的解决方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近新接到的一項工作是把SQL Server中保存了四五年的陳年數(shù)據(jù)(合同,付款,報銷等等單據(jù))進行歸檔,原因是每天的數(shù)據(jù)增量很大,而歷史數(shù)據(jù)又不經(jīng)常使用,影響生產(chǎn)環(huán)境的數(shù)據(jù)查詢等操作。要求是:

  1 歸檔的數(shù)據(jù)與生產(chǎn)環(huán)境數(shù)據(jù)分開保存,以便提高查詢效率和服務(wù)器性能。

  2 前端用戶能夠查詢已歸檔的數(shù)據(jù),即系統(tǒng)提供的功能不能發(fā)生改變

  看起來要求不是很高,我自然會聯(lián)想到兩種方法,第一種新建一個與生產(chǎn)環(huán)境一樣的數(shù)據(jù)庫,把歸檔數(shù)據(jù)保存到這個數(shù)據(jù)庫中;第二種在生產(chǎn)環(huán)境為每個表創(chuàng)建一個后綴為_Archive的表,例如Invoice,? 那么就要創(chuàng)建一個Invoice_Archive表示存放歸檔的數(shù)據(jù)表。這兩種方法可以用跨數(shù)據(jù)庫訪問或視圖的方式,解決數(shù)據(jù)查詢等需求。仔細(xì)分析后,弊端是需要對現(xiàn)行系統(tǒng)進行改造,即需要修改代碼,以便適應(yīng)對歸檔數(shù)據(jù)的訪問,實際也把數(shù)據(jù)訪問和業(yè)務(wù)操作給藕荷了,是一個費力又不討好的解決方法。

  有沒有一種方法可以不修改系統(tǒng)能夠透明的訪問生產(chǎn)數(shù)據(jù)和歸檔數(shù)據(jù)呢?當(dāng)然是有的,就是SQL Server提供的分區(qū)表。

  在這里就不累贅復(fù)述分區(qū)表的定義和作用了,要想精通就要認(rèn)真讀微軟官方文檔:SQL Server 2005 中的分區(qū)表和索引。我濃縮的作用就是,通過使用分區(qū)表可以將數(shù)據(jù)表分割到不用的磁盤文件中,不同的磁盤就意味著性能的提升,因為兩個磁頭讀取數(shù)據(jù)當(dāng)然要比一個磁頭讀取數(shù)據(jù)快了,然后用戶可以透明地根據(jù)不同的訪問方式選取數(shù)據(jù)。舉個例子:一個合同表,有個字段Archived標(biāo)識是否歸檔(0代表未歸檔,1代表已歸檔),我們可以用分區(qū)表的方式,將合同表分成兩個表分別保存在不同的磁盤,例如c和d, 當(dāng)我們將一個合同設(shè)置為已歸檔,這條記錄就會從c盤轉(zhuǎn)到d盤,平時我們只查詢未歸檔的記錄,如果要查已歸檔的記錄,也只需要select * from Contracts where Archived = 1這么簡單,即透明的查詢,具體的實現(xiàn)我們不用關(guān)心。

好了,不能光說不練,就驗證一下。創(chuàng)建兩個文件目錄

  

創(chuàng)建一個測試數(shù)據(jù)庫

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ù)屬性,有點不一樣

打開數(shù)據(jù):

use?TestDB

新建分區(qū)函數(shù),參數(shù)類型是bit,即已歸檔的數(shù)據(jù)

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

新建一個分區(qū)方案,即已經(jīng)歸檔的數(shù)據(jù)保存到TestDB_Part2分區(qū)文件上

CREATE?Partition?Scheme?TestDB_ArchivePatitionScheme?AS?PARTITION?TestDB_ArchivePartitionRangeTO?([PRIMARY],?TestDB_Part2);

創(chuàng)建一個測試數(shù)據(jù)表,綁定一個分區(qū)方案

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

插入一些新的數(shù)據(jù),已供測試

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');?

先來一個普通查詢

看看每個分區(qū)表存放數(shù)據(jù)的情況,分區(qū)一有3條記錄,分區(qū)2沒有記錄,即沒有歸檔數(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ù)訪問性能,而且可以根據(jù)需要分別存儲數(shù)據(jù)到不同的文件,方便我們有效地利用數(shù)據(jù),簡化系統(tǒng)開發(fā)的復(fù)雜性。

https://www.cnblogs.com/qq260250932/p/5479037.html

總結(jié)

以上是生活随笔為你收集整理的SQL Server数据归档的解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。