1. 程式人生 > >SQL Server 2008中的分割槽表(四):刪除(合併)一個分割槽

SQL Server 2008中的分割槽表(四):刪除(合併)一個分割槽

在前面我們介紹過如何建立和使用一個分割槽表,並舉了一個例子,將不 同年份的資料放在不同的物理分割槽表裡。具體的分割槽方式為:

    第1個小表:2010-1-1以前的資料(不包含2010-1-1)。

    第2個小表:2010-1-1(包含2010-1-1)到2010-12-31之間的資料。

    第3個小表:2011-1-1(包含2011-1-1)到2011-12-31之間的資料。

    第4個小表:2012-1-1(包含2012-1-1)到2012-12-31之間的資料。

    第5個小表:2013-1-1(包含2013-1-1)之後的資料。

    分割槽函式的程式碼如下所示:

  1. CREATE PARTITION FUNCTION partfunSale (datetime)  AS RANGE RIGHT FOR VALUES (
    '20100101','20110101','20120101','20130101')    
 

    假設我們在建立分割槽表之後發現,2010年以前的資料並不多,完全可以將它們與2010年的資料進行合併,放在同一個分割槽裡,也就是說,具體的分割槽方式改為:

    第1個小表:2011-1-1以前的資料(不包含2011-1-1)。

    第2個小表:2011-1-1(包含2011-1-1)到2011-12-31之間的資料。

    第3個小表:2012-1-1(包含2012-1-1)到2012-12-31之間的資料。

    第4個小表:2013-1-1(包含2013-1-1)之後的資料。

    由於上面的需求更改了資料分割槽的條件,因此,我們必須要修改分割槽函式,因為分割槽函式的作用就是要來告訴SQL Server怎麼存放資料的。只要分割槽函式修改了,SQL Server會自動將資料重新分配,按照新的分割槽函式指定的方式來儲存資料。

    先假設我們還沒有建立過分割槽表,要滿足上面的條件,我們必須要寫出如下程式碼的建立分割槽函式的SQL語句

  1. CREATE PARTITION FUNCTION partfunSale (datetime)    
  2. AS RANGE RIGHT FOR VALUES ('20110101','20120101','20130101')   
 

    比較一個新的分割槽函式和老的分割槽函式,看看他們有什麼區別?

    的確,我們很容易就可以發現,老的分割槽函式裡多了一個分界值——也就是'20100101'。那麼,修改老的分割槽函式,事實上就是將這分界值刪除。簡單一點說,刪除(合併)一個分割槽,事實上就是在分割槽函式中將多餘的分界值刪除。

    刪除分割槽函式中的分界值,也就是修改分割槽函式的方法如下所示:

  1. ALTER PARTITION FUNCTION partfunSale()  
  2.     MERGE RANGE ('20100101')  
 

    其中:

    1、ALTER PARTITION FUNCTION 意思是修改分割槽函式

    2、partfunSale()為分割槽函式名

    3、MERGE RANGE意思是合併界限。事實上,合併界限和刪除分界值是一個意思。

    我們可以在修改分割槽函式時先統計一下各物理分割槽中的記錄總數,在修改分割槽之後,再統計一下各物理分割槽中的記錄總數,看一下修改分割槽函式後的資料變化情況,程式碼如下所示:

  1. --統計所有分割槽表中的記錄總數      
  2. select $PARTITION.partfunSale(SaleTime) as 分割槽編號,count(id) as 記錄數 from Sale group by $PARTITION.partfunSale(SaleTime)  
  3. --原來的分割槽函式是將2010-1-1之前的資料放在第1個分割槽表中,將2010-1-1至2011-1-1之間的資料放在第2個分割槽表中  
  4. --現在需要將2011-1-1之前的資料都放在第1個分割槽表中,也就是將第1個分割槽表和第2個分割槽表中的資料合併  
  5. --修改分割槽函式  
  6. ALTER PARTITION FUNCTION partfunSale()  
  7.     MERGE RANGE ('20100101')  
  8. --統計所有分割槽表中的記錄總數      
  9. select $PARTITION.partfunSale(SaleTime) as 分割槽編號,count(id) as 記錄數 from Sale group by $PARTITION.partfunSale(SaleTime)  
 

    執行結果如下圖所示:

    現在還有一個問題,就是通過修改分割槽函式合併資料之後,資料都存放在哪裡了?在修改之前,資料分別存放在檔案組Sale2009和Sale2010中,修改之後,資料放到哪裡去了呢?

    事實上,在修改分割槽函式之後,SQL Server也會自動修改分割槽方案,將處於兩個物理分割槽中的資料放在同一個物理分割槽裡了。可以通過檢視分割槽方案的方式來檢視資料具體的存放位置。

    檢視分割槽方案的方式為:在SQL Server Management Studio中,選擇資料庫-->儲存-->分割槽方案,右擊分割槽方案名,在彈出的選單中選擇“編寫分割槽方案指令碼為”-->CREATE到-->新查詢編輯器視窗

    然後在新查詢編輯器視窗可以看到下圖程式碼。

    從上圖中可以看出,分割槽方案將原來Sale2010檔案組中的資料合併到了Sale2009檔案組中。