最近工作中由于某些表数据量过大,对表进行分区从而优化了查询效率,下面贴出来与大家分享一下:
--1 、创建数据库
CREATE DATABASE BigDataTestDB
--2 、创建文件组
ALTER DATABASE BigDataTestDB ADD FILEGROUP YEARFG1
ALTER DATABASE BigDataTestDB ADD FILEGROUP YEARFG2
ALTER DATABASE BigDataTestDB ADD FILEGROUP YEARFG3
ALTER DATABASE BigDataTestDB ADD FILEGROUP YEARFG4
--3 、为文件组添加文件来进行物理数据存储
ALTER DATABASE BigDataTestDB ADD FILE ( NAME = 'YEARF1' , FILENAME = 'C:\ADVWORKSF1.NDF' ) TO FILEGROUP YEARFG1 ;
ALTER DATABASE BigDataTestDB ADD FILE ( NAME = 'YEARF2' , FILENAME = 'C:\ADVWORKSF2.NDF' ) TO FILEGROUP YEARFG2 ;
ALTER DATABASE BigDataTestDB ADD FILE ( NAME = 'YEARF3' , FILENAME = 'C:\ADVWORKSF3.NDF' ) TO FILEGROUP YEARFG3 ;
ALTER DATABASE BigDataTestDB ADD FILE ( NAME = 'YEARF4' , FILENAME = 'C:\ADVWORKSF4.NDF' ) TO FILEGROUP YEARFG4 ;
--4 、创建分区函数
USE BigDataTestDB ;
GO
CREATE PARTITION FUNCTION YEARPF ( datetime )
AS
RANGE LEFT FOR VALUES ( '01/01/2010' , '01/01/2011' , '01/01/2012' )
--5 、创建分区架构
CREATE PARTITION SCHEME YEARPS
AS PARTITION YEARPF TO ( YEARFG1 , YEARFG2 , YEARFG3 , YEARFG4 )
--6 、创建使用此 SCHEME 的表
CREATE TABLE PARTITIONTEST
(
ID INT NOT NULL IDENTITY (1,1),
CONTITLE VARCHAR (500)NULL,
USERNAME VARCHAR (100)NULL,
CONTEXT TEXT NULL,
HITCOUNT INT NULL,
CREATETIME DATETIME not NULL
) ON YEARPS ( CREATETIME )
--7 、填充数据
DECLARE @DT datetime , @NUM INT , @N INT
SET @DT = CONVERT ( varchar (12),'2009-01-01',23)
SET @N =1
WHILE @N >=0
BEGIN
SET @NUM =1
WHILE @NUM <=10000
BEGIN
INSERT INTO dbo . PARTITIONTEST ( CONTITLE , USERNAME , CONTEXT , HITCOUNT , CREATETIME )
VALUES ( CONVERT ( varchar (12),@DT,23)+' 文章,编号: ' + CAST ( @NUM AS VARCHAR (5)),' 用户 ' + CAST ( @NUM AS VARCHAR (5)),CONVERT(varchar(12),@DT,23)+' 文章内容: ' + CAST ( @NUM AS VARCHAR (5)),@NUM,@DT)
SET @NUM +=1
END
SET @DT = DATEADD ( DAY ,1,@DT)
SET @N = datediff ( day , CONVERT ( varchar (12),@DT,23),'2012-12-09')
END
--8 、查看插入数据的分布
SELECT *, $PARTITION . YEARPF ( CREATETIME ) FROM dbo . PARTITIONTEST
--9 、查看分区的数据量的分布
SELECT * FROM SYS . partitions WHERE OBJECT_ID = OBJECT_ID ( 'PARTITIONTEST' )
--******** 修改分区 ********
--1 、更改分区架构 , 让下一个分区使用已经存在的分区 YEARFG4 分区
ALTER PARTITION SCHEME YEARPS NEXT USED YEARFG4 ;
--2 、更改分区函数
ALTER PARTITION FUNCTION YEARPF () SPLIT RANGE ( '01/01/2013' )
SELECT *, $PARTITION . YEARPF ( CREATETIME ) FROM dbo . PARTITIONTEST ;
SELECT * FROM SYS . partitions WHERE OBJECT_ID = OBJECT_ID ( 'PARTITIONTEST' )