天天看點

SQL Server 2005中的分區表(三):将普通表轉換成分區表

    在設計資料庫時,經常沒有考慮到表分區的問題,往往在資料表承重的負擔越來越重時,才會考慮到分區方式,這時,就涉及到如何将普通表轉換成分區表的問題了。

    那麼,如何将一個普通表轉換成一個分區表 呢?說到底,隻要将該表建立一個聚集索引,并在聚集索引上使用分區方案即可。

    不過,這回說起來簡單,做起來就複雜了一點。還是接着上面的例子,我們先使用以下SQL語句将原有的Sale表删除。

--删除原來的資料表

drop table Sale 

    然後使用以下SQL語句建立一個新的普通表,并在這個表裡插入一些資料。

--建立一個普通的資料表

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 2005中的分區表(三):将普通表轉換成分區表

    在以上代碼中,我們可以看出,這個表擁有一般普通表的特性——有主鍵,同時這個主鍵還是聚集索引。前面說過,分區表是以某個字段為分區條件,是以,除了這個字段以外的其他字段,是不能建立聚集索引的。是以,要想将普通表轉換成分區表,就必須要先删除聚集索引,然後再建立一個新的聚集索引,在該聚集索引中使用分區方案。

    可惜的是,在SQL Server中,如果一個字段既是主鍵又是聚集索引時,并不能僅僅删除聚集索引。是以,我們隻能将整個主鍵删除,然後重新建立一個主鍵,隻是在建立主鍵時,不将其設為聚集索引,如以下代碼所示:

--删掉主鍵

ALTER TABLE Sale DROP constraint PK_Sale

--建立主鍵,但不設為聚集索引

ALTER TABLE Sale ADD CONSTRAINT PK_Sale PRIMARY KEY NONCLUSTERED

(

[ID] ASC

) ON [PRIMARY] 

    在重新非聚集主鍵之後,就可以為表建立一個新的聚集索引,并且在這個聚集索引中使用分區方案,如以下代碼所示:

--建立一個新的聚集索引,在該聚集索引中使用分區方案

CREATE CLUSTERED INDEX CT_Sale ON Sale([SaleTime])

ON partschSale([SaleTime]) 

    為表建立了一個使用分區方案的聚集索引之後,該表就變成了一個分區表,檢視其屬性,如下圖所示。

SQL Server 2005中的分區表(三):将普通表轉換成分區表

    我們可以再一次使用以下代碼來看看每個分區表中的記錄數。

--統計所有分區表中的記錄總數

select $PARTITION.partfunSale(SaleTime) as 分區編号,count(id) as 記錄數 from Sale group by $PARTITION.partfunSale(SaleTime)  

    以上代碼的運作結果如下所示,說明在将普通表轉換成分區表之後,資料不但沒有丢失,而且還自動地放在了它應在的分區表中了。

SQL Server 2005中的分區表(三):将普通表轉換成分區表

原創不容易,轉載請注明出處。http://blog.csdn.net/smallfools/archive/2009/12/03/4934119.aspx

相關連結:

SQL Server 2005中的分區表(一):什麼是分區表?為什麼要用分區表?如何建立分區表?

SQL Server 2005中的分區表(二):如何添加、查詢、修改分區表中的資料

SQL Server 2005中的分區表(三):将普通表轉換成分區表 

SQL Server 2005中的分區表(四):删除(合并)一個分區

SQL Server 2005中的分區表(五):添加一個分區

SQL Server 2005中的分區表(六):将已分區表轉換成普通表