最近新接到的一項工作是把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
查看數據屬性,有點不一樣
打開數據:
新建分區函數,參數類型是bit,即已歸檔的數據
新建一個分區方案,即已經歸檔的數據保存到TestDB_Part2分區文件上
創建一個測試數據表,綁定一個分區方案
插入一些新的數據,已供測試
先來一個普通查詢
看看每個分區表存放數據的情況,分區一有3條記錄,分區2沒有記錄,即沒有歸檔數據
好了,我們歸檔一條記錄看看
結果就是我們想要的。
總結:利用分區表不僅能大幅提升數據訪問性能,而且可以根據需要分別存儲數據到不同的文件,方便我們有效地利用數據,簡化系統開發的復雜性。