好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SqlServer自动化分区方案

本文是我关于数据库分区的方案的一些想法,或许有些问题。仅供大家讨论。SqlServer (SqlServer 2005\SqlServer 2008)实现分区需要在企业版下进行. SqlServer的分区分为大致有以下个过程:1、创建文件组用以存放数据文件 2、创建文件组用户数据文件 3、创建分

  本文是我关于数据库分区的方案的一些想法,或许有些问题。仅供大家讨论。SqlServer (SqlServer 2005\SqlServer 2008)实现分区需要在企业版下进行.

  SqlServer的分区分为大致有以下个过程:1、创建文件组用以存放数据文件 2、创建文件组用户数据文件 3、创建分区函数 4、创建分区方案 5、在分区方案下创建表

  本文是在SqlServer2012 下完成的。

  过程:

1、新建数据库,在属性中创建文件以及文件组。如下图:

  

  可以在下图中选择文件组、或者新建文件组用户存放上图中新建的文件:

  

  2、创建分区函数

 CREATE  PARTITION  FUNCTION   [  partitionById  ] ( int  ) 
  AS  RANGE  LEFT   FOR   VALUES  ( 100 ,  200 ,  300 ) 

3、创建分区方案

 CREATE  PARTITION SCHEME  [  partitionSchemeById  ]  
 AS  PARTITION  [  partitionById  ]  --分区函数
 TO  ( [  FileGroup1  ] ,  [  FileGroup2  ] ,   [  FileGroup3  ],[FileGroup4] ) 

  注意以上分区函数使用的是LEFT ,根据后面的值指明了数据库中如何存放。以上存放方式为:- ∞, 100],(100,200],(200,300],(300,+ ∞).此分区方案是依据分区函数

 partitionById 创建的。那就是说以上Id的存储区间分别被放在 [FileGroup1], [FileGroup2],  [FileGroup3],[FileGroup4]文件组的文件中。

4、依据分区方案创建表

 CREATE   TABLE   [  dbo  ] . [  Account  ]  (
      [  Id  ]   [  int  ]   NULL  ,
      [  Name  ]   [  varchar  ] ( 20 )  NULL  ,
      [  Password  ]   [  varchar  ] ( 20 )  NULL  ,
      [  CreateTime  ]   [  datetime  ]   NULL  
)   ON   partitionSchemeById(Id)  

  注意: 创建表的脚本中需要指明分区方案和分区依据列

  查看某分区的数据:

 SELECT   *   FROM  
 [  dbo  ] . [  Account  ] 
 WHERE  $PARTITION. [  partitionById  ] (Id) =  1  

  查询结果如下图:

至此,分区似乎已经结束了。但是看看后一个分区里的数据:Id>=400的全部放在了一个数据文件中。这样在有可能瓶颈就发生在了这个分区中。

如果数据不停的增长,希望分区也不断的自动增加。如:每天生成一个新的分区来存放分区新的数据。如到第二天时,新生成一个分区来存放(400,500 ]的数据。

这里我采用了Sql Job的方式来自动产生分区:

 DECLARE   @maxValue   INT  ,
      @secondMaxValue   INT  ,
      @differ      INT  ,
      @fileGroupName   VARCHAR ( 200  ),
      @fileNamePath      VARCHAR ( 200  ),
      @fileName     VARCHAR ( 200  ),
      @sql          NVARCHAR ( 1000  )


  SET   @fileGroupName  =  '  FileGroup  '  +  REPLACE ( REPLACE ( REPLACE ( CONVERT ( varchar ,  GETDATE (),  120  ), '  -  ' , '' ), '   ' , '' ), '  :  ' , ''  ) 
  PRINT   @fileGroupName 
 SET   @sql  =  '  ALTER DATABASE [Test] ADD FILEGROUP   '  +  @fileGroupName 
 PRINT   @sql 
 EXEC ( @sql  )

  SET   @fileNamePath  =  '  C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLINSTANCE\MSSQL\DATA\  '  +  REPLACE ( REPLACE ( REPLACE ( CONVERT ( varchar ,  GETDATE (),  120  ), '  -  ' , '' ), '   ' , '' ), '  :  ' , '' )  +  '  .NDF  ' 
 SET   @fileName  = N '  File  '  +  REPLACE ( REPLACE ( REPLACE ( CONVERT ( varchar ,  GETDATE (),  120  ), '  -  ' , '' ), '   ' , '' ), '  :  ' , ''  ) 

  SET   @sql  =  '  ALTER DATABASE [Test] ADD FILE (NAME=  '''  +  @fileName  +  '''  ,FILENAME=N  '''  +  @fileNamePath  +  '''  ) TO FILEGROUP  '  +  '      '  +  @fileGroupName 
 PRINT   @sql 
 PRINT   1 
 EXEC ( @sql  )
  PRINT   2 

 --  修改分区方案,用一个新的文件组用于存放下一新增的数据 
 SET   @sql  =  '  ALTER PARTITION SCHEME [partitionSchemeById] NEXT USED  '  +  '      '  +  @fileGroupName 
 EXEC ( @sql  )
    --  分区架构 
 PRINT   3  
 SELECT   @maxValue   =  CONVERT ( INT , MAX  (value))
  FROM   SYS.PARTITION_RANGE_VALUES PRV

  SELECT   @secondMaxValue   =   CONVERT ( INT , MIN  (value))
  FROM   
(
      SELECT   TOP   2   *   FROM  SYS.PARTITION_RANGE_VALUES  ORDER   BY  VALUE  DESC  
)
 PRV 

  SET   @differ  =  @maxValue   -   @secondMaxValue  


 ALTER  PARTITION  FUNCTION  partitionById()   --  分区函数 
SPLIT RANGE ( @maxValue+  @differ )  

这样在计划里指定每天什么时候运行,下图:

参考:http://www.cnblogs.com/lyhabc/articles/2623685.html



查看更多关于SqlServer自动化分区方案的详细内容...

  阅读:40次