按时间动态生成分区脚本

原创 2016年05月30日 13:59:43
--生成分区脚本
DECLARE @DataBaseName NVARCHAR(50)--数据库名称
DECLARE @TableName NVARCHAR(50)--表名称
DECLARE @ColumnName NVARCHAR(50)--字段名称
DECLARE @PartNumber INT--需要分多少个区
DECLARE @Location NVARCHAR(50)--保存分区文件的路径
DECLARE @Size NVARCHAR(50)--分区初始化大小
DECLARE @FileGrowth NVARCHAR(50)--分区文件增量
--DECLARE @FunValue INT--分区分段值
DECLARE @i INT
DECLARE @y INT      --起始年份
DECLARE @m INT      --起始月份
DECLARE @d INT      --起始天
DECLARE @dayGap INT --分区分段值 天数
DECLARE @PartNumberStr NVARCHAR(50)
DECLARE @sql NVARCHAR(max)
DECLARE @ValueStart NVARCHAR(50)


--设置下面变量
SET @DataBaseName = 'HEJIEXUN'
SET @TableName = 'DYNAMINE_A_REAL_DATA'
SET @ColumnName = 'TIME'
SET @PartNumber = 500
SET @Location = 'C:\HejiexunServer\Database\'
SET @Size = '80MB'
SET @FileGrowth = '30%'


SET @y = 2015
SET @m = 1
SET @d = 1
SET @dayGap = 3


--1.创建文件组
SET @i = 1
PRINT '--1.创建文件组'
WHILE @i <= @PartNumber
BEGIN
    SET @PartNumberStr =  RIGHT('000' + CONVERT(NVARCHAR,@i),4)
    SET @sql = 'ALTER DATABASE ['+@DataBaseName +']
ADD FILEGROUP [FG_'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+']'
    PRINT @sql + CHAR(13)
    SET @i=@i+1
END


--2.创建文件
SET @i = 1
PRINT CHAR(13)+'--2.创建文件'
WHILE @i <= @PartNumber
BEGIN
    SET @PartNumberStr =  RIGHT('000' + CONVERT(NVARCHAR,@i),4)
    SET @sql = 'ALTER DATABASE ['+@DataBaseName +']
ADD FILE
(NAME = N''FG_'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+'_data'',FILENAME = N'''+@Location+'FG_'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+'_data.ndf'',SIZE = '+@Size+', FILEGROWTH = '+@FileGrowth+' )
TO FILEGROUP [FG_'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+'];'
    PRINT @sql + CHAR(13)
    SET @i=@i+1
END




--3.创建分区函数
PRINT CHAR(13)+'--3.创建分区函数'
DECLARE @FunValueStr NVARCHAR(MAX) 


--SET @FunValueStr = substring(@FunValueStr,1,len(@FunValueStr)-1)
SET @sql = 'CREATE PARTITION FUNCTION
Fun_'+@TableName+'_'+@ColumnName+'(DATETIME) AS
RANGE RIGHT
FOR VALUES('
PRINT @sql


SET @i = 1
SET @FunValueStr = ''
WHILE @i < @PartNumber
BEGIN
    SET @FunValueStr = @FunValueStr + '''' + RIGHT(CONVERT(NVARCHAR, @y),4) + '-' + RIGHT('0' + CONVERT(NVARCHAR, @m),2) + '-' + RIGHT('0' + CONVERT(NVARCHAR, @d),2) + ' 00:00:00.000'','
    SET @d = @d + @dayGap
IF (@d > 30 OR (@m = 2 AND @d > 28))  --二月需要特殊处理一下
        BEGIN
            SET @d = 1
            SET @m = @m + 1
            if (@m > 12)
                BEGIN
                    SET @m = 1
                    SET @y = @y + 1
                END
        END
    IF (@i = @PartNumber - 1)
BEGIN
SET @FunValueStr = substring(@FunValueStr,1,len(@FunValueStr)-1)
END
    PRINT @FunValueStr
    SET @FunValueStr = ''
    SET @i=@i+1
END
PRINT ')' + CHAR(13)






--4.创建分区方案
PRINT CHAR(13)+'--4.创建分区方案'
DECLARE @FileGroupStr NVARCHAR(MAX) 
--SET @FileGroupStr = substring(@FileGroupStr,1,len(@FileGroupStr)-1)
SET @sql = 'CREATE PARTITION SCHEME
Sch_'+@TableName+'_'+@ColumnName+' AS
PARTITION Fun_'+@TableName+'_'+@ColumnName+'
TO('
PRINT @sql
SET @i = 1
SET @FileGroupStr = ''
WHILE @i <= @PartNumber
BEGIN
    SET @PartNumberStr =  RIGHT('000' + CONVERT(NVARCHAR,@i),4)
    SET @FileGroupStr = @FileGroupStr + '[FG_'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+'],'
    
    IF (@i = @PartNumber)
BEGIN
SET @FileGroupStr = substring(@FileGroupStr,1,len(@FileGroupStr)-1)
END
    PRINT @FileGroupStr
    SET @FileGroupStr = ''
    
    SET @i=@i+1
END
PRINT ')'






--5.分区函数的记录数
PRINT CHAR(13)+'--5.分区函数的记录数'
SET @sql = 'SELECT $PARTITION.Fun_'+@TableName+'_'+@ColumnName+'('+@ColumnName+') AS Partition_num,
  MIN('+@ColumnName+') AS Min_value,MAX('+@ColumnName+') AS Max_value,COUNT(1) AS Record_num
FROM dbo.'+@TableName+'
GROUP BY $PARTITION.Fun_'+@TableName+'_'+@ColumnName+'('+@ColumnName+')
ORDER BY $PARTITION.Fun_'+@TableName+'_'+@ColumnName+'('+@ColumnName+');'
PRINT @sql + CHAR(13)

mysql5.5 数据表根据日期分区实例

将产生的数据根据日期分区,一天一个分区,创建分区实例如下: /*==============================================================*/ /*...
  • lianchangshuai
  • lianchangshuai
  • 2013年02月25日 16:27
  • 6602

mysql按日期分区函数

这个是一个月的,实测已经通过。当然了,如果想做一年的,在加个循环就是了。哈哈,如果是小白,记得要点击函数那个从beging到end的地方复制进去,至于参数的部分,在函数创建的那个界面的下方有,填上去就...
  • CharlesHealan
  • CharlesHealan
  • 2017年10月25日 10:00
  • 1638

sql server2008对字符串日期字段分区

这次分区的特点有两个: 1:对已经使用的数据库进行分区,网上大多数例子是新建的分区和数据库。 2:对字符串类型日期进行分区。 这两点还是很有参考价值的。...
  • lsh6688
  • lsh6688
  • 2014年07月30日 14:19
  • 4621

mysql 表分区按年分区,季度子分区

alter table zz_info partition by range(year(date2)) subpartition by hash(quarter(date2 )) subpartit...
  • default7
  • default7
  • 2017年07月08日 01:14
  • 689

mysql自动按时间分区实例

#删除表 DROP TABLE `records`; #重新建表 CREATE TABLE `records`( `id` BIGINT(20) AUTO_INCREMENT, `advert_...
  • Guns_NRoses
  • Guns_NRoses
  • 2016年11月30日 18:11
  • 2593

mysql 按日期分区

 1、建立分区表 CREATE TABLE sale_data ( sale_date  DATETIME NOT NULL, ale_item  VARCHAR(2) NOT NULL,...
  • wsxqaz
  • wsxqaz
  • 2015年04月27日 17:25
  • 4164

oracle表分区详解(按天、按月、按年等)

分区表的概念:    当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表...
  • zhang123456456
  • zhang123456456
  • 2016年12月30日 23:14
  • 781

记录一次给mysql加日期分区的经历

使用range建立分区,先是在本地5.0.45版本mysql上建立,一直失败。 于是到测试服务器5.5.35上建立,也失败,而且错误提示信息模糊。 于是从网上最简单的做起,最后发现,跟表的主键有关...
  • shuwei003
  • shuwei003
  • 2015年02月13日 17:32
  • 903

oracle按时间创建分区表

首先明确分区表和表分区的区别:表分区是一种思想,分区表示一种技术实现。当表的大小过G的时候可以考虑进行表分区,提高查询效率,均衡IO。oracle分区表是oracle数据库提供的一种表分区的实现形式。...
  • shanhuhau
  • shanhuhau
  • 2014年02月24日 09:57
  • 15332

oracle11g分区表按时间自动创建

oracle11g分区表按时间自动创建
  • rznice
  • rznice
  • 2017年02月13日 14:46
  • 3695
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:按时间动态生成分区脚本
举报原因:
原因补充:

(最多只允许输入30个字)