对于大表的数据处理,我们很容易想到对表进行分区,其实就是将一个表的数据按照某一个可以进行分段处理的字段进行截取拆分,(“存储的时候通过这个字段观察,表数据是一段一段的效果”),分别存放在不同的文件组,文件组又分别存放在不同的硬盘上,这样通过提高系统的I/O来提高系统对数据处理的性能。这里只记录如何进行分区处理操作的步骤,简单的说就5步:添加文件组 > 添加文件 > 创建分区函数 > 创建分区方案(架构) > 创建分区表假定已经创建了Test库,有一个表UpLoadFiles存放上传文件的记录,按照上传的时期对表进行分区。
1 添加文件组 >
/* ----给Test库添加3个文件组FG1,FG2,FG3---- */ ALTER DATABASE test ADD FILEGROUP [ FG1 ] ; ALTER DATABASE test ADD FILEGROUP [ FG2 ] ; ALTER DATABASE test ADD FILEGROUP [ FG3 ] ;
2 添加文件 >
/* ----给3个文件组分别添加3个文件DataFG1.ndf、DataFG2.ndf、DataFG3.ndf,存放在不同位置,这里用d,e,f盘模拟三块硬盘---- */ ALTER DATABASE test ADD FILE (NAME = N ' DataFG1 ' ,filename = N ' d:/Data1/DataFG1.ndf ' ,size = 3072KB,filegrowth = 1024KB) TO FILEGROUP [ FG1 ] ; ALTER DATABASE test ADD FILE (NAME = N ' DataFG2 ' ,filename = N ' e:/Data2/DataFG2.ndf ' ,size = 3072KB,filegrowth = 1024KB) TO FILEGROUP [ FG2 ] ; ALTER DATABASE test ADD FILE (NAME = N ' DataFG3 ' ,filename = N ' f:/Data3/DataFG3.ndf ' ,size = 3072KB,filegrowth = 1024KB) TO FILEGROUP [ FG3 ] ;
3 创建分区函数 >
/* ----就是数据插入不同分区的分段依据,这里有三个分区,第一分区:20000101以前的数据第二分区:20000101——20020101这间的数据第三分区:20020101以后的数据------- */ CREATE PARTITION FUNCTION [ DataPartitionRange ] ( DATETIME ) AS RANGE RIGHT FOR VALUES ( ' 20000101 ' , ' 20020101 ' ) ; /* ----说明:RANGE RIGHT表示:边界值20000101属于第二分区,边界值20020101属于第三分区,如果是RANGE LEFT表示:边界值20000101属于第一分区,边界值20020101属于第二分区,以此类推---- */
4 创建分区方案(架构) >
/* ----供表UpLoadFiles依赖的系统架构,这个架构又依赖上面的分区函数,将分区函数的分区分别存放在不同的文件组(数据文件)---- */ CREATE PARTITION SCHEME [ DataPartitionScheme ] AS PARTITION [ DataPartitionRange ] TO ( [ FG1 ] , [ FG2 ] , [ FG3 ] ) ;
5 创建分区表
/* ----创建依赖上面分区方案的分区表,Insert数据的时候会根据分区方案按UploadDate将记录存放在不同的文件组下---- */ CREATE TABLE UpLoadFiles ( [ ID ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL , -- 自动编号 [ FileName ] [ nvarchar ] ( 50 ) NULL , -- 文件名 [ Content ] [ nvarchar ] ( 500 ) NULL , -- 文件描述 [ UploadDate ] [ datetime ] NOT NULL -- 上传日期 ) ON DataPartitionScheme(UploadDate) ;
模拟插入500W条数据
这里可以看出,虽然ID是自动编号但并不连续,是因为数据插入的时候已经根据UploadDate进行了分区,这前10条是分区1里的数据,下面再看看各分区的数据分布情况:
--查看分区数据分布情况 SELECT $PARTITION.[DataPartitionRange](UploadDate) AS [分区编号] , MIN(UploadDate) AS [上传最小时期] , MAX(UploadDate) AS [上传最大时期] , COUNT(*) AS [分区下记录数] FROM UpLoadFilesGROUP BY $PARTITION.[DataPartitionRange] (UploadDate)ORDER BY [分区下记录数]
测试环境:Windows 2003 Server + SQL Server 2005