对于大容量数据库表,且有一定业务规则的(比如有时间规则)可作如下分区,以提升综合性能
第一,创建分区函数:根据业务规则创建(比如一个月分一个或几个月分一个)
第二,创建文件组:根据规则,将每一条规则对应一个文件(物理文件,NDF)
第三,创建建立分区架构,用来将概念上的分区和文件组(物理文件)关联起来
第四,建立分区表
以上做完,当执行INSERT时,分区表会根据分区架构将记录插入不同的NDF文件中;当执行SELECT时,分区表也会根据分区架构从不同的NDF中查寻。
具体实现如下:
CREATE PARTITION FUNCTION FiveYearDateRangePFN(datetime)
ASRANGE LEFT FOR VALUES ('20100930 23:59:59.997', -- 2010年9 月'20101031 23:59:59.997', -- 2010年10 月'20101130 23:59:59.997', -- 2010年11 月'20101231 23:59:59.997' -- 2010年12 月)GOALTER DATABASE TEST01 ADD FILEGROUP [Test201009]ALTER DATABASE TEST01 ADD FILEGROUP [Test201010]ALTER DATABASE TEST01 ADD FILEGROUP [Test201011]ALTER DATABASE TEST01 ADD FILEGROUP [Test201012]GOALTER DATABASE TEST01ADD FILE (NAME = N'Test201009',FILENAME = N'D:\DataFileGroup\Test201009.ndf',SIZE = 5MB,MAXSIZE = 100MB,FILEGROWTH = 5MB)TO FILEGROUP [Test201009]GOALTER DATABASE TEST01ADD FILE (NAME = N'Test201010',FILENAME = N'D:\DataFileGroup\Test201010.ndf',SIZE = 5MB,MAXSIZE = 100MB,FILEGROWTH = 5MB)TO FILEGROUP [Test201010]GOALTER DATABASE TEST01ADD FILE (NAME = N'Test201011',FILENAME = N'D:\DataFileGroup\Test201011.ndf',SIZE = 5MB,MAXSIZE = 100MB,FILEGROWTH = 5MB)TO FILEGROUP [Test201011]goALTER DATABASE TEST01ADD FILE (NAME = N'Test201012',FILENAME = N'D:\DataFileGroup\Test201012.ndf',SIZE = 5MB,MAXSIZE = 100MB,FILEGROWTH = 5MB)TO FILEGROUP [Test201012]GOCREATE PARTITION SCHEME [FiveYearDateRangePScheme]ASPARTITION FiveYearDateRangePFN TO( [Test201009],[Test201010],[Test201011],[Test201012],[PRIMARY])GOCREATE TABLE [dbo].[Test]( [ID] [uniqueidentifier] NOT NULL, [Name] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NULL, [Date] [datetime] NOT NULL ) ON FiveYearDateRangePScheme(Date)ALTER TABLE [Test]ADD CONSTRAINT [ObjTeaching_PK] PRIMARY KEY CLUSTERED ([ID], [Date])goinsert into Test(id,name,date) values(newid(),'20100901','2010-09-01')insert into Test(id,name,date) values(newid(),'20101001','2010-10-01')insert into Test(id,name,date) values(newid(),'20101101','2010-11-01')insert into Test(id,name,date) values(newid(),'20101201','2010-12-01')select $partition.FiveYearDateRangePFN(date),date,*from Test aorder by a.date ascGO