關於SQLSERVER表分區的介紹(一)
一直想寫文章,可惜到現在才有時間,真的對不起大家。今天介紹一下SQLSERVER的表分區,算是掃盲吧,哈哈~
我打算分成兩篇,一篇是介紹概念、語法之類的,一篇是介紹使用方法,還有文中使用的SQLSERVER是SQLSERVER2005個人開發版
下面進入正題吧,很多時候當單張數據表的數據量比較大的時候比如千萬級別條記錄、上億級別記錄,如果不做優化,那么查詢的效率大家清楚。
有經驗的人會通過各種手段做優化,其中表分區就是其中一種手段。
個人對表分區的口語化解釋:把一張表分成幾個區域
例如:一張業務表,有一個字段是月份或者年份,那么可以按照月份/年份來分區,當客戶要查詢某個月份/年份的數據的時候就到那個月份/年份的分區去查詢,
不用整個表去查詢,這樣就提高了不小效率。還是就是可以把分區文件組放在不同的磁盤分區或者不同的硬盤去,減少磁盤I/O。
以上這些都是表分區的特點。
下面說一下概念吧~
SQLSERVER數據庫服務器中包含很多數據庫對象,其中就包括分區類對象。
分區類對象
分區類對象是對“分區方案”和“分區函數”兩類對象的總稱。SQLSERVER2005引入了數據表分區的概念。引入分區的目的是為了提高對數據表的維護,從而
提高數據庫的性能。分區,即將一個原本的大數據表拆分成較小的多個數據表,由於需要查詢的數據局限於空間的局部性,即查詢的記錄往往位於同一分區中,因此
通過分區,實際上可以將在大量數據集中進行查詢的操作轉換為在小部分數據中進行查詢的操作,從而獲得更快更高的查詢效率。除此之外,將數據分區也有利於
數據庫的維護操作(例如,重新生成索引或備份表也可以更快地運行)
實際操作過程中,也可以不拆分數據表,而是將數據表安排到不同磁盤驅動器上的方法來實現分區。例如,將數據表放在某個物理磁盤上並將相關的表放在不同
的磁盤驅動器上,同樣可以提高查詢性能,因為在運行涉及表間連接的查詢時,多個磁頭可以同時讀取數據。可以使用SQLSERVER文件組來指定放置表的磁盤。
水平分區與垂直分區
如果將原有的大數據表拆分成多個小數據表,則通常被稱為水平分區。水平分區的特點是每個分區中包含的列數是一樣的,但是其中每個分區表中的記錄數被
減少了。而與之對應的,還有一種被稱為垂直分區的方案,即將一個數據表中的列划分為到多個結構較為簡單的數據表中。
注意:推薦使用水分分區,這樣應用程序的代碼邏輯可以不變,實際上應用表分區(水平分區)之后跟應用之前對應用程序都是透明的!
在SQLSERVER2005中創建分區表的步驟如下:
(1)創建分區函數以指定如何分區,以及分區所涉及的數據表
(2)創建分區方案以指定分區函數的分區在文件組上的位置
(3)創建使用分區方案的表
一、分區函數
分區函數用於指定如何對數據表進行分區。分區函數可將數據表中指定部分映射到一組分區。因此在創建分區函數時需要指定分區數、分區依據列(即使用哪一列作為分區的參考列)
以及各分區依據列值的范圍(即屬於同一分區的各記錄中,依據列值應滿足的范圍)。需要注意的是,在指定分區依據列時,只能指定一列。
打個比方:大數據表中有一列是時間列,如果按照月份來分區,那么分區數是12,分區依據列是時間列(時間列格式:XXXX-XX-XX XX:XX:XX),按照時間列中的月份來划分
范圍,哪個時間屬於哪個月份。
SQLSERVER2005中用於創建分區函數的T-SQL腳本命令是CREATE PARTITION FUNCTION。語法:
CREATE PARTITION FUNCTION partition_function_name(input_parameter_type)
AS RANGE[LEFT|RIGHT]
FOR VALUES([boundary_value[,...n] ])
[;]
其中參數partition_function_name為要創建的分區函數名,input_parameter_type為該函數的輸入參數類型,該參數就是用於實現分區的依據列的數據類型。
而選項RANGE,通過LEFT (即小於)和RIGHT(即大於)來指定分區的約束條件,即是小於依據列的值、還是大於依據列的值。
參數boundary_value用於指定每個分區的邊界值。
二、分區方案
在計划分區方案時,必須決定要在哪個文件組上放置分區。將分區安排在獨立的文件組上的主要優勢是可以確保在分區上獨立地執行備份操作。即分別對
每個獨立的文件組進行備份(分區跟文件組進行映射,所以對文件\文件組備份相當於對分區進行備份)關於備份請看下面的補充。需要注意的是,在設計
分區方案之前,必須首先使用分區函數來指定分區的個數,以及每個分區的范圍。即必須首先在CREATE PARTITION FUNCTION語句中創建分區函數,
然后才能創建分區方案。
使用T-SQL創建分區方案的語法如下所示:
CREATE PARTITION SCHEME partition_scheme_name
AS PARTITION partition_function_name
[ALL] TO ({file_group_name|[PRIMARY]}[,...n] )
[;]
其中參數partition_scheme_name為要創建的分區方案的名稱。分區方案名稱在數據庫中必須是唯一的,並且符號標識符規則。參數partition_function_name
為需要使用的分區函數的名。由分區函數創建的分區將被映射到在分區方案中指定的文件組中。必須注意,partition_function_name應已存在於當前的數據庫中。
如果在上述T-SQL語句中使用了選項ALL,就表明所有分區都將被映射到同一個file_group_name中提供的文件組,或映射到主文件組(如果指定了[PRIMARY])
中(一般不使用ALL,如果使用了那么分多個文件組就沒有意義了,因為所有分區的數據都存放在同一個文件組)。
補充:關於SQLSERVER中文件組備份
摘錄自:http://www.e800.com.cn/articles/2007/0828/280690.shtml
當備份一個數據庫時,一個選擇是備份一個文件組而不是整個數據庫。這對於大型數據庫特別有用。一個大型數據庫,取決於硬件,大概500GB,備份會花費幾個小時。事實上,我曾看過一個系統花費四到五個小時去備份一個那么大的數據庫。備份花費資源,並且可能並不值得每天晚上花五小時做完全備份工作。
這個問題有幾種解決方案。我曾見過設定每周做一次完全備份,一系列事務日志和一整個星期執行的差異備份。這樣可行,但是你每個星期將仍然需要一個長時間的單獨窗口來做完全備份。
如果你將數據庫分解為大小都差不多的七個文件組來替代, 那會怎么樣呢?在那種情況下,它們都是72GB左右大小,並且你將每天晚上備份一個文件組。這會將原來很長的完全的備份縮短為七個較短的文件組的備份,並經過一個星期你將完成整個數據庫的備份。我曾經用過一些包含海量數據的數據庫,其相當大的一部分是只讀的。
依據遵從性檢查的要求,像Sarbanes-Oxley,一個大型的金融數據庫大小可能為600GB或700GB,但經常大部分是回溯到七年或更久以前的歷史數據。如果你有這樣的數據庫並且只有20%的數據有規律地改變,那你可能可以通過利用文件組來提高效率。把規律變化的表放到你的主要文件組里,把歷史的或存檔表放到一個存檔文件組里。現在你可以每天備份主要文件組,或許一個星期或一個月備份一次存檔文件組。
參考文獻:http://it.china-b.com/sjk/sqlserver/20090826/176946_1.html
http://www.e800.com.cn/articles/2007/0828/280690.shtml
特別說一下,SQLSERVER備份的最小單位是文件組不是文件,所以備份跟恢復都是文件組不是文件


就寫到這里吧~ 下篇介紹分區函數和分區方案的創建和使用方法
鏈接:關於SQLSERVER表分區的介紹(二) http://www.cnblogs.com/lyhabc/articles/2623685.html
然后插入數據到分區表報錯沒有分配文件
