SqlServer 2005 将已存在大量数据的表更改为分区表
? 一、分区表简介: 使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性。 二、创建步骤: 现有一张表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',FILEGROWTH = 5MB) TO FILEGROUP [lisfq] ? ALTER DATABASE listest ADD FILE (NAME = N'lis200812',FILENAME = N'f:/data/lis200812.ndf',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',结果如下图: ? ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |