1. 程式人生 > >SQL Server 2005中的分區表(三):將普通表轉換成分區表

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

成了 insert 刪掉 -- pri light part ide 新建

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

那麽,如何將一個普通表轉換成一個分區表 呢?說到底,只要將該表創建一個聚集索引,並在聚集索引上使用分區方案即可。

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

[c-sharp] view plain copy
  1. --刪除原來的數據表
  2. drop table Sale

然後使用以下SQL語句創建一個新的普通表,並在這個表裏插入一些數據。

[c-sharp] view plain copy
  1. --新建一個普通的數據表
  2. CREATE TABLE Sale(
  3. [Id] [int] IDENTITY(1,1) NOT NULL, --自動增長
  4. [Name] [varchar](16) NOT NULL,
  5. [SaleTime] [datetime] NOT NULL,
  6. CONSTRAINT [PK_Sale] PRIMARY KEY CLUSTERED --創建主鍵
  7. (
  8. [Id] ASC
  9. )
  10. )
  11. --插入一些記錄
  12. insert Sale ([Name],[SaleTime]) values (‘張三‘,‘2009-1-1‘)
  13. insert Sale ([Name],[SaleTime]) values (‘李四‘,‘2009-2-1‘)
  14. insert Sale ([Name],[SaleTime]) values (‘王五‘,‘2009-3-1‘)
  15. insert Sale ([Name],[SaleTime]) values (‘錢六‘,‘2010-4-1‘)
  16. insert Sale ([Name],[SaleTime]) values (‘趙七‘,‘2010-5-1‘)
  17. insert Sale ([Name],[SaleTime]) values (‘張三‘,‘2011-6-1‘)
  18. insert Sale ([Name],[SaleTime]) values (‘李四‘,‘2011-7-1‘)
  19. insert Sale ([Name],[SaleTime]) values (‘王五‘,‘2011-8-1‘)
  20. insert Sale ([Name],[SaleTime]) values (‘錢六‘,‘2012-9-1‘)
  21. insert Sale ([Name],[SaleTime]) values (‘趙七‘,‘2012-10-1‘)
  22. insert Sale ([Name],[SaleTime]) values (‘張三‘,‘2012-11-1‘)
  23. insert Sale ([Name],[SaleTime]) values (‘李四‘,‘2013-12-1‘)
  24. insert Sale ([Name],[SaleTime]) values (‘王五‘,‘2014-12-1‘)

使用以上代碼創建的表是普通表,我們來看一下表的屬性,如下圖所示。

技術分享

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

可惜的是,在SQL Server中,如果一個字段既是主鍵又是聚集索引時,並不能僅僅刪除聚集索引。因此,我們只能將整個主鍵刪除,然後重新創建一個主鍵,只是在創建主鍵時,不將其設為聚集索引,如以下代碼所示:

[c-sharp] view plain copy
  1. --刪掉主鍵
  2. ALTER TABLE Sale DROP constraint PK_Sale
  3. --創建主鍵,但不設為聚集索引
  4. ALTER TABLE Sale ADD CONSTRAINT PK_Sale PRIMARY KEY NONCLUSTERED
  5. (
  6. [ID] ASC
  7. ) ON [PRIMARY]

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

[c-sharp] view plain copy
  1. --創建一個新的聚集索引,在該聚集索引中使用分區方案
  2. CREATE CLUSTERED INDEX CT_Sale ON Sale([SaleTime])
  3. ON partschSale([SaleTime])

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

技術分享

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

[c-sharp] view plain copy
  1. --統計所有分區表中的記錄總數
  2. 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

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