zoukankan      html  css  js  c++  java
  • SqlServer 自动化分区方案

      本文是我关于数据库分区的方案的一些想法,或许有些问题。仅供大家讨论。SqlServer (SqlServer 2005SqlServer 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 FilesMicrosoft SQL ServerMSSQL11.MSSQLINSTANCEMSSQLDATA'+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



  • 相关阅读:
    Web负载均衡的几种实现方式
    Apache和Nginx的区别
    Nginx和Apache区别
    Git 使用中显示“Another git process seems to be running in this repository...”问题解决
    上传本地代码到gitHub过程详解
    MySQL数据库中varchar与char类型的区别
    正则表达式中/i,/g,/ig,/gi,/m的区别和含义
    内行看门道:看似“佛系”的《QQ炫舞手游》,背后的音频技术一点都不简单
    惧怕羊毛党?腾讯云为你保驾护航
    教你1天搭建自己的“微视”
  • 原文地址:https://www.cnblogs.com/tyb1222/p/3388438.html
Copyright © 2011-2022 走看看