標籤:blog http 使用 io strong 資料 ar art
我的俄羅斯名叫作“不折騰不舒服斯基”,所以,不將分區表好好折騰一下,我就是不舒服。
在前面,我們介紹過怎麼樣直接建立一個分區表,也介紹過怎麼將一個普通錶轉換成一個分區表。那麼,這兩種方式建立的表有什麼區別呢?現在,我又最新地建立了兩個表:
第一個表名為Sale,這個表使用的是《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中的分區表(四):刪除(合并)一個分區》,事實上,就是將分區函數中的所有分區分界都刪除,那麼,這個分區表中的所有資料就只能存在第一個分區表中了。在本例中,可以使用以下代碼來修改分區函數。
[c-sharp] view plaincopy
- 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語句刪除,如本例中可以使用以下代碼刪除已經建立的分區索引。
[c-sharp] view plaincopy
- drop index Sale1.CT_Sale1
一開始,我還以為只要刪除了分區索引,那麼分區表就會自動轉換成普通表了,可是在刪除索引之後,查看一下該表的屬性,結果還是資料分割資料表,如所示。
不但如此,而且,還不能將原來的聚集的唯一索引(在本例中為主鍵的那個索引)改成叢集索引,如所示。
如果要徹底解決這個問題,還必須要在原來建立分區索引的欄位上重新建立一下索引,只有重新建立過索引之後,SQL Server才能將資料分割資料表轉換成普通表。在本例中可以使用以下代碼重新建立索引。
[c-sharp] view plaincopy
- CREATE CLUSTERED INDEX CT_Sale1 ON Sale1([SaleTime])
- ON [PRIMARY]
- Go
重建索引之後,分區表就變成了普通表,現在再查看一下Sale1表的屬性,我們可以看到原來的分區表已經變成了普通表,如所示。
當然,以上兩個步驟也可以合成一步完成,也就是在重建索引的同時,將原索引刪除。如以下代碼所示:
[c-sharp] view plaincopy
- CREATE CLUSTERED INDEX CT_Sale1 ON Sale1([SaleTime])
- WITH ( DROP_EXISTING = ON)
- ON [PRIMARY]
按理說,在SQL Server Management Studio中的操作和使用SQL語句的操作是一樣的,可是我在SQL Server Management Studio中將叢集索引刪除後再在該欄位上重新建立一個同名的索引,並重建和組織該索引,可是分區表還是沒有變成普通表,這就讓我百思不得其解了。不過呢,只要能用SQL語句達到目的,那我們就用它吧。
原創不容易,轉載請註明出處。http://blog.csdn.net/smallfools/archive/2009/12/14/5004100.aspx