1. 程式人生 > >SqlServer 2005 將已存在大量數據的表更改為分區表

SqlServer 2005 將已存在大量數據的表更改為分區表

幫助 fun 數據庫文件 where 聚集 sys 方案 measure 讀寫

一、分區表簡介:

使用分區表的主要目的,是為了改善大型表以及具有各種訪問模式的表的可伸縮性和可管理性。
分區一方面可以將數據分為更小、更易管理的部分,為提高性能起到一定的作用;另一方面,對於如果具有多個CPU的系統,分區可以對表的操作通過並行的方式進行,這對於提升性能是非常有幫助的。

二、創建步驟:

現有一張表L_TESTRESULT共有3千萬條記錄,本文主要的目的是對這張表按時間進行分區,以便提高對該表的操作效率。

1、 創建新文件組,最好新建一個文件組:

ALTER DATABASE listest ADD FILEGROUP [lisfq]

2、創建分區函數:

CREATE PARTITION FUNCTION MonthDateRange(datetime)

AS RANGE LEFT FOR VALUES

(

‘20071231 23:59:59.997‘,

‘20080630 23:59:59.997‘,

‘20081231 23:59:59.997‘

)

3、根據分區函數的時間分段點創建分區文件,分區文件最好與數據庫文件在不同的磁盤上,提高磁盤的讀寫速度:

ALTER DATABASE listest

ADD FILE

(NAME = N‘lis200712‘,FILENAME = N‘f:/data/lis200712.ndf‘,SIZE = 5MB,MAXSIZE = UNLIMITED,FILEGROWTH = 5MB)

TO FILEGROUP [lisfq]

ALTER DATABASE listest

ADD FILE

(NAME = N‘lis200806‘,FILENAME = N‘f:/data/lis200806.ndf‘,SIZE = 5MB,MAXSIZE = UNLIMITED,FILEGROWTH = 5MB)

TO FILEGROUP [lisfq]

ALTER DATABASE listest

ADD FILE

(NAME = N‘lis200812‘,FILENAME = N‘f:/data/lis200812.ndf‘,SIZE = 5MB,MAXSIZE = UNLIMITED,FILEGROWTH = 5MB)

TO FILEGROUP [lisfq]

4、創建分區架構,將分區函數應用到該架構上:

CREATE PARTITION SCHEME MonthDateRangeScheme

AS

PARTITION MonthDateRange

ALL TO ([lisfq])

已創建的分區函數與分區架構如下圖:

5、將已存在的數據表應用到該分區方案中,可以采用刪除需分區字段的索引的方式進行,如本例中我用measuretime對該表進行分區:

--刪除該分區字段上的索引

drop index l_testresult.IDX_L_TESTRESULT_MEASURETIME

--按分區方案創建索引

create index IDX_L_TESTRESULT_MEASURETIME

on l_testresult(measuretime)

on MonthDateRangeScheme(measuretime)

6、對於分區表中存在聚集索引,最好將其刪除重建:

--重建聚聚集索引主建

ALTER TABLE l_testresult

DROP CONSTRAINT PK_L_testresult

ALTER TABLE l_testresult

ADD CONSTRAINT PK_l_testresult

PRIMARY KEY CLUSTERED(sampleno,testid,sampletype,editstatus)

三、查詢分區信息:

1、查詢該表是不是分區成功:

SELECT * FROM SYS.PARTITIONS WHERE OBJECT_ID = OBJECT_ID(‘l_testresult‘),結果如下圖:

2、 查詢某段時間的數據位於哪個分區:

select * ,$PARTITION.MonthDateRange(measuretime) from l_testresult where measuretime>=‘2009-01-01‘,結果如下圖:

SqlServer 2005 將已存在大量數據的表更改為分區表