標籤:blog http 使用 io strong 資料 ar 2014
在設計資料庫時,經常沒有考慮到表分區的問題,往往在資料表承重的負擔越來越重時,才會考慮到分區方式,這時,就涉及到如何將普通錶轉換成分區表的問題了。
那麼,如何將一個普通錶轉換成一個分區表 呢?說到底,只要將該表建立一個叢集索引,並在叢集索引上使用資料分割配置即可。
不過,這回說起來簡單,做起來就複雜了一點。還是接著上面的例子,我們先使用以下SQL語句將原有的Sale表刪除。
[c-sharp] view plaincopy
- --刪除原來的資料表
- drop table Sale
然後使用以下SQL語句建立一個新的普通表,並在這個表裡插入一些資料。
[c-sharp] view plaincopy
- --建立一個普通的資料表
- CREATE TABLE Sale(
- [Id] [int] IDENTITY(1,1) NOT NULL, --自動成長
- [Name] [varchar](16) NOT NULL,
- [SaleTime] [datetime] NOT NULL,
- CONSTRAINT [PK_Sale] PRIMARY KEY CLUSTERED --建立主鍵
- (
- [Id] ASC
- )
- )
- --插入一些記錄
- insert Sale ([Name],[SaleTime]) values (‘張三‘,‘2009-1-1‘)
- insert Sale ([Name],[SaleTime]) values (‘李四‘,‘2009-2-1‘)
- insert Sale ([Name],[SaleTime]) values (‘王五‘,‘2009-3-1‘)
- insert Sale ([Name],[SaleTime]) values (‘錢六‘,‘2010-4-1‘)
- insert Sale ([Name],[SaleTime]) values (‘趙七‘,‘2010-5-1‘)
- insert Sale ([Name],[SaleTime]) values (‘張三‘,‘2011-6-1‘)
- insert Sale ([Name],[SaleTime]) values (‘李四‘,‘2011-7-1‘)
- insert Sale ([Name],[SaleTime]) values (‘王五‘,‘2011-8-1‘)
- insert Sale ([Name],[SaleTime]) values (‘錢六‘,‘2012-9-1‘)
- insert Sale ([Name],[SaleTime]) values (‘趙七‘,‘2012-10-1‘)
- insert Sale ([Name],[SaleTime]) values (‘張三‘,‘2012-11-1‘)
- insert Sale ([Name],[SaleTime]) values (‘李四‘,‘2013-12-1‘)
- insert Sale ([Name],[SaleTime]) values (‘王五‘,‘2014-12-1‘)
使用以上代碼建立的表是普通表,我們來看一下表的屬性,如所示。
在以上代碼中,我們可以看出,這個表擁有一般普通表的特性——有主鍵,同時這個主鍵還是叢集索引。前面說過,分區表是以某個欄位為分區條件,所以,除了這個欄位以外的其他欄位,是不能建立叢集索引的。因此,要想將普通錶轉換成分區表,就必須要先刪除叢集索引,然後再建立一個新的叢集索引,在該叢集索引中使用資料分割配置。
可惜的是,在SQL Server中,如果一個欄位既是主鍵又是叢集索引時,並不能僅僅刪除叢集索引。因此,我們只能將整個主鍵刪除,然後重新建立一個主鍵,只是在建立主鍵時,不將其設為叢集索引,如以下代碼所示:
[c-sharp] view plaincopy
- --刪掉主鍵
- ALTER TABLE Sale DROP constraint PK_Sale
- --建立主鍵,但不設為叢集索引
- ALTER TABLE Sale ADD CONSTRAINT PK_Sale PRIMARY KEY NONCLUSTERED
- (
- [ID] ASC
- ) ON [PRIMARY]
在重新非聚集主鍵之後,就可以為表建立一個新的叢集索引,並且在這個叢集索引中使用資料分割配置,如以下代碼所示:
[c-sharp] view plaincopy
- --建立一個新的叢集索引,在該叢集索引中使用資料分割配置
- CREATE CLUSTERED INDEX CT_Sale ON Sale([SaleTime])
- ON partschSale([SaleTime])
為表建立了一個使用資料分割配置的叢集索引之後,該表就變成了一個分區表,查看其屬性,如所示。
我們可以再一次使用以下代碼來看看每個分區表中的記錄數。
[c-sharp] view plaincopy
- --統計所有分區表中的記錄總數
- select $PARTITION.partfunSale(SaleTime) as 分區編號,count(id) as 記錄數 from Sale group by $PARTITION.partfunSale(SaleTime)
以上代碼的運行結果如下所示,說明在將普通錶轉換成分區表之後,資料不但沒有丟失,而且還自動地放在了它應在的分區表中了。
原創不容易,轉載請註明出處。http://blog.csdn.net/smallfools/archive/2009/12/03/4934119.aspx