SQL Server 2005中的分割槽表(六):將已分割槽錶轉換成普通表
我的俄羅斯名叫作“不折騰不舒服斯基”,所以,不將分割槽表好好折騰一下,我就是不舒服。
在前面,我們介紹過怎麼樣直接建立一個分割槽表,也介紹過怎麼將一個普通錶轉換成一個分割槽表。那麼,這兩種方式建立的表有什麼區別呢?現在,我又最新地建立了兩個表:
第二個表名Sale1,這個表使用的是《SQL Server 2005中的分割槽表(三):將普通錶轉換成分割槽表 》中的方法建立的,也就是先建立了一個普通表,然後通過為普通表新增聚集索引的方式將普通錶轉換成已分割槽表的方式。
通過以上方法都可以得到一個已分割槽表,但是,這兩個已分割槽表還是有點區別的,區別在哪裡呢?我們分別檢視一下這兩個表的索引和主鍵吧,如下圖所示。
從上圖可以看出,直接建立的分割槽表Sale的索引裡,只有一個名為PK_Sale的索引,這個索引是唯一的、非聚集的索引,也就是在建立PK_Sale主鍵時SQL Server自動建立的索引。而經普通錶轉換成分割槽表的Sale1的索引裡,除了在建立主鍵時由SQL Server自動建立的名為PK_Sale1的唯一的、非聚集的索引之外,還存在一個名為CT_Sale1的聚集索引。
對於表Sale來說,可以通過修改分割槽函式的方式來將其轉換成普通表,具體的修改方式請看《SQL Server 2005中的分割槽表(四):刪除(合併)一個分割槽》,事實上,就是將分割槽函式中的所有分割槽分界都刪除,那麼,這個分割槽表中的所有資料就只能存在第一個分割槽表中了。在本例中,可以使用以下程式碼來修改分割槽函式。
- ALTER PARTITION FUNCTION partfunSale()
- MERGE RANGE ('20100101')
- ALTER PARTITION FUNCTION partfunSale()
- MERGE RANGE ('20110101')
- ALTER PARTITION FUNCTION partfunSale()
- MERGE RANGE ('20120101')
- ALTER PARTITION FUNCTION partfunSale()
- MERGE RANGE ('20130101')
事實上,這麼操作之後,表Sale還是一個分割槽表,如下圖所示,只不過是只有一個分割槽的分割槽了,這和普遍表就沒有什麼區別了。
對於通過建立分割槽索引的方法將普通錶轉換成的分割槽表而言,除了上面的方法之外,還可以通過刪除分割槽索引的辦法來將分割槽錶轉換成普通表。但必須要經過以下兩個步驟:
1、刪除分割槽索引
2、在原來的索引欄位上重建一個索引。
先說刪除分割槽索引吧,這一步很簡單,你可以直接在SQL Server Management Studio上將分割槽索引刪除,也可以使用SQL語句刪除,如本例中可以使用以下程式碼刪除已經建立的分割槽索引。
- drop index Sale1.CT_Sale1
一開始,我還以為只要刪除了分割槽索引,那麼分割槽表就會自動轉換成普通表了,可是在刪除索引之後,檢視一下該表的屬性,結果還是已分割槽表,如下圖所示。
不但如此,而且,還不能將原來的聚集的唯一索引(在本例中為主鍵的那個索引)改成聚集索引,如下圖所示。
如果要徹底解決這個問題,還必須要在原來建立分割槽索引的欄位上重新建立一下索引,只有重新建立過索引之後,SQL Server才能將已分割槽錶轉換成普通表。在本例中可以使用以下程式碼重新建立索引。
- CREATE CLUSTERED INDEX CT_Sale1 ON Sale1([SaleTime])
- ON [PRIMARY]
- Go
重建索引之後,分割槽表就變成了普通表,現在再檢視一下Sale1表的屬性,我們可以看到原來的分割槽表已經變成了普通表,如下圖所示。
當然,以上兩個步驟也可以合成一步完成,也就是在重建索引的同時,將原索引刪除。如以下程式碼所示:
- CREATE CLUSTERED INDEX CT_Sale1 ON Sale1([SaleTime])
- WITH ( DROP_EXISTING = ON)
- ON [PRIMARY]
按理說,在SQL Server Management Studio中的操作和使用SQL語句的操作是一樣的,可是我在SQL Server Management Studio中將聚集索引刪除後再在該欄位上重新建立一個同名的索引,並重新生成和組織該索引,可是分割槽表還是沒有變成普通表,這就讓我百思不得其解了。不過呢,只要能用SQL語句達到目的,那我們就用它吧。