SqlServer2005 海量數據 數據表分區解決難題

今天遇到難題公司作股票交易系統數據量比較大光備份文件從03-09年就有500Gjava

雖然如今硬盤換到1500GB 但要解決怎樣將這些年的數據都附加到一個數據庫當中非常頭痛數據庫

在網上泡了一天終於找到比較理想的方案,但願有所幫助安全

 

 

 

超大型數據庫的大小經常達到數百GB,有時甚至要用TB來計算。而單表的數據量每每會達到上億的記錄,而且記錄數會隨着時間而增加。這不但影響着數據庫的運行效率,也增大數據庫的維護難度。除了表的數據量外,對錶不一樣的訪問模式也可能會影響性能和可用性。這些問題均可以經過對大表進行合理分區獲得很大的改善。當表和索引變得很是大時,分區能夠將數據分爲更小、更容易管理的部分來提升系統的運行效率。若是系統有多個CPU或是多個磁盤子系統,能夠經過並行操做得到更好的性能。因此對大表進行分區是處理海量數據的一種十分高效的方法。本文經過一個具體實例,介紹如何建立和修改分區表,以及如何查看分區表。函數

   SQL Server 2005

SQL Server 2005是微軟在推出SQL Server 2000後時隔五年推出的一個數據庫平臺,它的數據庫引擎爲關係型數據和結構化數據提供了更安全可靠的存儲功能,使用戶能夠構建和管理用於業務的高可用和高性能的數據應用程序。此外SQL Server 2005結合了分析、報表、集成和通知功能。這使企業能夠構建和部署經濟有效的BI解決方案,幫助團隊經過記分卡、DashboardWeb Services和移動設備將數據應用推向業務的各個領域。不管是開發人員、數據庫管理員、信息工做者仍是決策者,SQL Server 2005均可以提供出創新的解決方案,並可從數據中得到更多的益處。性能

它所帶來的新特性,如T-SQL的加強、數據分區、服務代理和與.Net Framework的集成等,在易管理性、可用性、可伸縮性和安全性等方面都有很大的加強。測試

   表分區的具體實現方法

表分區分爲水平分區和垂直分區。水平分區將表分爲多個表。每一個表包含的列數相同,可是行更少。例如,能夠將一個包含十億行的表水平分區成 12 個表,每一個小表表示特定年分內一個月的數據。任何須要特定月份數據的查詢只需引用相應月份的表。而垂直分區則是將原始表分紅多個只包含較少列的表。水平分區是最經常使用分區方式,本文以水平分區來介紹具體實現方法。大數據

水平分區經常使用的方法是根據時期和使用對數據進行水平分區。例如本文例子,一個短信發送記錄表包含最近一年的數據,可是隻按期訪問本季度的數據。在這種狀況下,可考慮將數據分紅四個區,每一個區只包含一個季度的數據。spa

2.1     建立文件組

創建分區表先要建立文件組,而建立多個文件組主要是爲了得到好的 I/O 平衡。通常狀況下,文件組數最好與分區數相同,而且這些文件組一般位於不一樣的磁盤上。每一個文件組能夠由一個或多個文件構成,而每一個分區必須映射到一個文件組。一個文件組能夠由多個分區使用。爲了更好地管理數據(例如,爲了得到更精確的備份控制),對分區表應進行設計,以便只有相關數據或邏輯分組的數據位於同一個文件組中。使用 ALTER DATABASE,添加邏輯文件組名:設計

ALTER DATABASE [DeanDB] ADD FILEGROUP [FG1]代理

DeanDB爲數據庫名稱,FG1文件組名。建立文件組後,再使用 ALTER DATABASE 將文件添加到該文件組中:

ALTER DATABASE [DeanDB] ADD FILE ( NAME = N'FG1', FILENAME = N'C:\DeanData\FG1.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [FG1]

相似的創建四個文件和文件組,並把每個存儲數據的文件放在不一樣的磁盤驅動器裏。

2.2     建立分區函數

建立分區表必須先肯定分區的功能機制,表進行分區的標準是經過分區函數來決定的。建立數據分區函數有RANGE LEFT | / RIGHT」兩種選擇。表明每一個邊界值在局部的哪一邊。例如存在四個分區,則定義三個邊界點值,並指定每一個值是第一個分區的上邊界(LEFT) 仍是第二個分區的下邊界 (RIGHT)[1]。代碼以下:

CREATE PARTITION FUNCTION [SendSMSPF](datetime) AS RANGE RIGHT FOR VALUES ('20070401', '20070701', '20071001')

2.3     建立分區方案

建立分區函數後,必須將其與分區方案相關聯,以便將分區指向至特定的文件組。就是定義實際存放數據的媒體與各數據塊的對應關係。多個數據表能夠共用相同的數據分區函數,通常不共用相同的數據分區方案。能夠經過不一樣的分區方案,使用相同的分區函數,使不一樣的數據表有相同的分區條件,但存放在不一樣的媒介上。建立分區方案的代碼以下:

CREATE PARTITION SCHEME [SendSMSPS] AS PARTITION [SendSMSPF] TO ([FG1], [FG2], [FG3], [FG4])

2.4     建立分區表

創建好分區函數和分區方案後,就能夠建立分區表了。分區表是經過定義分區鍵值和分區方案相聯繫的。插入記錄時,SQL SERVER會根據分區鍵值的不一樣,經過分區函數的定義將數據放到相應的分區。從而把分區函數、分區方案和分區表三者有機的結合起來。建立分區表的代碼以下:

CREATE TABLE SendSMSLog

([ID] [int] IDENTITY(1,1) NOT NULL,

[IDNum] [nvarchar](50) NULL,

[SendContent] [text] NULL

[SendDate] [datetime] NOT NULL,

) ON SendSMSPS(SendDate)

2.5     查看分區表信息

系統運行一段時間或者把之前的數據導入分區表後,咱們須要查看數據的具體存儲狀況,即每一個分區存取的記錄數,那些記錄存取在那個分區等。咱們能夠經過$partition.SendSMSPF來查看,代碼以下:

SELECT $partition.SendSMSPF(o.SendDate)

                     AS [Partition Number]

       , min(o.SendDate) AS [Min SendDate]

       , max(o.SendDate) AS [Max SendDate]

       , count(*) AS [Rows In Partition]

FROM dbo.SendSMSLog AS o

GROUP BY $partition.SendSMSPF(o.SendDate)

ORDER BY [Partition Number]

在查詢分析器裏執行以上腳本,結果如圖1所示:

 

1 分區表信息


2.6     
維護分區

分區的維護主要設計分區的添加、減小、合併和在分區間轉換。能夠經過ALTER PARTITION FUNCTION的選項SPLITMERGEALTER TABLE的選項SWITCH來實現。SPLIT會多增長一個分區,而MEGRE會合並或者減小分區,SWITCH則是邏輯地在組間轉換分區。

   性能對比

咱們對2650萬數據,存儲空間佔用約4G的單表進行性能對比,測試環境爲IBM365CPU 至強2.7G*2、內存 16G、硬盤 136G*2,系統平臺爲Windows 2003 SP1+SQL Server 2005 SP1。測試結果如表1

1:分區和未分區性能對比表(單位:毫秒)

測試項目          分區            未分區

1             16546             61466

2                13                33

3             20140             61546

4             17140             61000

說明:

1:根據時間檢索某一天記錄所耗時間

2:單條記錄插入所耗時間

3:根據時間刪除某一天記錄所耗時間

4:統計每個月的記錄數所需時間

從表1能夠看出,對分區表進行操做比未分區的表要快,這是由於對分區表的操做採用了CPUI/O的並行操做,檢索數據的數據量也變小了,定位數據所耗時間變短。

   結束語

對海量數據的處理一直是一個使人頭痛的問題。分離的技術是全部設計者們首先考慮的問題,不論是分離應用程序功能仍是分離數據訪問,若是加以了合理規劃,都能十分有效的解決大數據表的運行效率低和維護成本高等問題。SQL Server 2005新增的表分區功能,能夠對數據進行合理分區,當用戶在訪問部分數據時,SQL Server最佳化引擎能夠根據數據的實體存放,找出最佳的執行方案,而不至於大海撈針。

相關文章
相關標籤/搜索