一、分区表简介:
使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性。
分区一方面可以将数据分为更小、更易管理的部分,为提高性能起到一定的作用;另一方面,对于如果具有多个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',结果如下图: