資料庫分割槽表(一)什麼情況下需要分割槽,準備需要分割槽的資料
什麼資料庫需要進行分割槽?首先看一下我們的案例:2010年6月我們六期IT開發團隊接到一個XX全國連鎖店的餐飲系統,經過一週的敏捷開發之後,XX餐飲系統正式上線了,由於該軟體的功能強大,操作簡單,功能靈活等特性,很快在全國各地鋪展開來。XX餐飲店的美食也頗受顧客的喜愛,有的店每天的收入高達1W元人民幣,每天這麼多的收入,那麼每天要產生多大的訂單呢?< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
這是一個很大的資料量,在剛開始的幾個月中,我們還能夠正常根據所產生的所有訂單,根據產品的類別和銷售情況,產生一個商品銷售排行報表。可是隨著 資料量越來越大,現在每次進行商品銷售排行彙總都要進行很長時間的等待。而我們的伺服器效能是沒有問題的,那麼我們只有改善資料庫的結構來提高資料的檢索 效率了。改善資料庫的結構有兩種,一種是採用儲存過程代替普通的SQL語句,另外一種就是使用資料庫系統中增強索引和規劃分割槽表進行優化,這裡我們採用第二種方案來解決問題。
我們這裡採用資料分割槽表的方法來進行資料優化,那麼是不是隻要資料量足夠大之後就要進行資料庫分割槽表來提高查詢效率呢?資料多了並不是建立分割槽表的惟一條件,哪怕你有一千萬條記錄,但是這一千萬條記錄都是常用的記錄,那麼最好也不要使用分割槽表,說不定會得不償失。只有你的資料是分段的資料,那麼才要考慮到是否需要使用分割槽表。這裡我們的資料是按時間段進行查詢的,所以我們可以在這裡進行分割槽。
上面這些就是我們進行資料分割槽表的前提,如果你有這樣的需求,那麼還等什麼,趕快使用資料分割槽表吧。
資料庫分割槽表(二)什麼是分割槽表?
表分割槽分為水平分割槽和垂直分割槽。水平分割槽將表分為多個表。每個表包含的列數相同,但是行更少。例如,可以將一個包含十億行的表水平分割槽成 12 個表,每個小表表示特定年份內一個月或幾個月的資料。任何需要特定月份資料的查詢只需引用相應月份的表。而垂直分割槽則是將原始表分成多個只包含較少列的表。水平分區是最常用分割槽方式,後面我們以水平分割槽來介紹具體實現方法。
簡單一點說,分割槽表就是將一個大表分成若干個小表。這裡,我們有一個銷售記錄表,記錄著每個某餐飲店的訂單情況,那麼你就可以把這個銷售記錄表按時間分成幾個小表,我們這裡分成15個小表。2011年以前的記錄使用一個表,2011年的記錄每兩個月使用一個表(2011//01/01-2011/03/01,每個兩個月一個表,一共六個表),2012年,2013()年的的記錄同上,2013年的記錄使用一個表,2012年以後的記錄使用一個表。那麼,你想查詢哪個年份的記錄,就可以去相對應的表裡查詢,由於每個表中的記錄數少了,查詢起來時間自然也會減少。
但將一個大表分成幾個小表的處理方式,會給程式設計師增加程式設計上的難度。以新增記錄為例,以上15個表是獨立的15個表,在不同時間新增記錄的時候,程式設計師要使用不同的SQL語句,例如在2011年新增記錄時,程式設計師要將記錄新增到2011年那個表裡;在2012年新增記錄時,程式設計師要將記錄新增到2012年的那個表裡。這樣,程式設計師的工作量會增加,出錯的可能性也會增加。
使用分割槽表就可以很好的解決以上問題。分割槽表可以從物理上將一個大表分成幾個小表,但是從邏輯上來看,還是一個大表。分割槽表可以將一個銷售記錄表分成十五個物理上的小表,但是對於程式設計師而言,他所面對的依然是一個大表,無論是2010年新增記錄還是2012年新增記錄,對於程式設計師而言是不需要考慮的,他只要將記錄插入到銷售記錄表——這個邏輯中的大表裡就行了。SQL Server會自動地將它放在它應該呆在的那個物理上的小表裡。
同樣,對於查詢而言,程式設計師也只需要設定好查詢條件,OK,SQL Server會自動將去相應的表裡查詢,不用管太多事了。
分割槽表的準備工作完事了,下一步就是具體建立分割槽表了,等不急了吧,看下篇博文你就知道了。
資料庫分割槽表(三)如何建立分割槽表1?
建立分割槽表必須要經過下面五個步驟。
1)建立檔案組
2)建立檔案
3)建立分割槽函式
4)建立分割槽方案
5)建立分割槽表
(1)建立檔案組,有兩種方案,一種是通過手動新增,另外一種就是通過SQL指令碼進行新增。下面以兩種方案來說明:
方案一:建立檔案組,雖然這一步我們可以省略,因為我們可以直接使用Primary檔案(也就是系統主檔案)。但是為了方便管理,我們還是要建立幾個檔案組,這樣可以將不同的小表(不同時間段,或者不同資料表)放在不同的檔案組裡,既便於理解又可以提高執行速度。
資料庫分割槽表(三)如何建立分割槽表2?
(3)建立分割槽函式
建立一個分割槽函式,建立分割槽函式的目的是告訴SQL Server以什麼方式對分割槽表進行分割槽。這一步必須要什麼SQL指令碼來完成。以上面的例子,我們要將銷售記錄表按時間分成15個小表。劃分的時間為:
第1個小表:2011-01-01以前的資料(不包含2010-01-01)。
第2個小表:2011-01-01(包含2011-01-01)到2010-01-01之間的資料。
第3個小表:2011-03-01(包含2011-03-01)到2011-05-01之間的資料。
第4個小表:2011-05-01(包含2011-05-01)到2011-07-01之間的資料。
第5個小表:……
第6個小表:……
--建立分割槽函式
CREATE PARTITION FUNCTION partfun_CX (datetime)
AS RANGE RIGHT FOR VALUES ('20110101','20110301','20110501','20110701','20110901','20111101','20120101','20120301','20120501','20120701','20120901','20121101','20130101','20130301','20130501','20130701')
1、CREATE PARTITION FUNCTION意思是建立一個分割槽函式。
2、partfun_CX為分割槽函式名稱。
3、AS RANGE RIGHT為設定分割槽範圍的方式為Right,也就是右置方式。
4、FOR VALUES ('20110101','20110301','20110501','20130101',……)為按這些個值來分割槽,Values中的值就是分割槽的條件
(4)建立分割槽方案
分割槽方案的作用是將分割槽函式生成的分割槽對映到檔案組中去。分割槽函式的作用是告訴SQL Server,如何將資料進行分割槽,而分割槽方案的作用則是告訴SQL Server將已分割槽的資料放在哪個檔案組中。
--.建立分割槽方案
CREATE PARTITION SCHEME partsch_CX
AS PARTITION partfun_CX
TO (
CX2010,
CX2011, CX2011, CX2011, CX2011, CX2011,CX2011,
CX2012, CX2012, CX2012, CX2012, CX2012,CX2012,
CX2013, CX2013, CX2013, CX2013)
1、CREATE PARTITION SCHEME意思是建立一個分割槽方案。
2、partsch_CX為分割槽方案名稱。
3、AS PARTITION partfun_CX說明該分割槽方案所使用的資料劃分條件(也就是所使用的分割槽函式)為partfun_CX。
4、TO後面的內容是指partfun_CX分割槽函式劃分出來的資料對應存放的檔案組。
到此為止,分割槽函式和分割槽方案就建立完畢了。建立後的分割槽函式和分割槽方案在資料庫的“儲存”中可以看到
(5)建立分割槽表
建立分割槽表,建立方式和建立普遍表類似,如下所示:
CREATE TABLE t_partition3(
ptId int IDENTITY(1,1) NOT NULL primary key NONCLUSTERED,
ptName varchar(16) NOT NULL, 酷站網軟
sellTime[datetime] NOT NULL
) ON partsch_CX(sellTime)
如果你按照上面的程式碼來實現的話出出現下圖所示的錯誤程式碼提示:
訊息1908,級別16,狀態1,第1 行
列'sellTime' 是索引'PK__t_partition3__671F4F74' 的分割槽依據列。唯一索引的分割槽依據列必須是索引鍵的子集。
訊息1750,級別16,狀態0,第1 行
無法建立約束。請參閱前面的錯誤訊息。
這裡是不能建立除分割槽表中除分割槽欄位以外的其它欄位為聚集索引,因為聚集索引是在物理上順序儲存的,而分割槽表是將資料分別儲存在不同的表中,這兩個概念是衝 突的。如果我們建立了其它欄位的聚集索引,那麼就會按照其它欄位在物理上順序儲存,而我們的分割槽表是根據分割槽欄位進行物理上的順序儲存的。
我們的資料庫已經投入使用一段時間了,但是當時沒有建立建立分割槽表,現在我們需要做的是將普通錶轉換成分割槽表,但是並不能影響我們資料庫裡面的資料,那麼我們應該如何做呢?只需在該表上建立一個聚集索引,並在該聚集索引中使用分割槽方案即可。
說的很簡單,但是在實現實現可就沒有那麼容易了,因為你的資料庫中存在主鍵,外來鍵等約束關係,那麼我們在將普通錶轉換成分割槽表時,首先就需要解決這些問題。
我們知道分割槽表時某個欄位為分割槽條件的,除了這個欄位之外的其他欄位是不能建立聚集索引的,所以我們將普通錶轉換成分割槽表時,必須要刪除聚集索引,然後再重新建立一個新的聚集索引,在該聚集索引中使用分割槽方案。
但是我們需要修改的t_sellLog表中的orderId既是主鍵又是聚集索引,而且還是其它表的外來鍵。因此,我們只能先刪除外來鍵關聯,再刪除主鍵,然後重新建立orderId為主鍵,但是設定為非聚集索引,然後將我們的sellTime欄位設定為聚集索引,最後新增上我們的外來鍵約束,至此普通錶轉換成分割槽表的工作結束