如何对已经存在的表进行加分区方案分区函数

我参考网上的,写了2给存储过程,一个初始创建文分区方案分区函数;一个可以通过作业新增文件组文件件;

但是初始没有绑定表,网上的都是在创建表是绑定分区方案,但是我的表是已经存在的,怎么绑定

初始存储过程

USE [DB3]
GO
/****** Object:  StoredProcedure [dbo].[FQ_DB3_his_order_goods2_part_ID_first]    Script Date: 2024/7/12 9:25:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

--每新增@FQROWS(500000)条记录新增一个文件和文件组
Create PROCEDURE [dbo].[FQ_DB3_his_order_goods2_part_ID_first]
AS
BEGIN
    DECLARE --@FilePath VARCHAR(100),                      --文件路径
            --@FileName VARCHAR(100),                      --文件名称
            --@FileSize VARCHAR(100),                      --文件大小
            --@FileGrowth VARCHAR(100),                    --文件增长
            --@FileMaxLimit VARCHAR(100),                  --文件最大限制
            --@FileGroupName VARCHAR(100),                 --文件组名称
            --@Database VARCHAR(100),                      --操作数据库
            @CurrentNum VARCHAR(2), --当前新分区计数
            @SchemeName VARCHAR(100),                    --分区方案名称
            --@PartitionName VARCHAR(100),                 --分区函数名称
            @FQROWS  int=100000;   --每个分区文件放的记录数 默认 500000
            --@sql VARCHAR(400);    -- 赋值文件属性
    --SET @FileSize = '8MB';
    --SET @FileGrowth = '1MB';
    --SET @FileMaxLimit = 'unlimited';
    -- 赋值分区属性
    SET @SchemeName = 'his_order_goods2_part_id_fa';   --'cti_IDFQ_Scheme'; 分区方案名称
    --SET @PartitionName ='his_order_goods2_part_id_func()'; --   'cti_IDFQ_Func()';  分区函数名称

    declare @rows as int
    select @rows=count(*) from his_order_goods2_part;

    --没有为当前表创建分区和分区函数
    SELECT count(*) FROM sys.partition_functions  where name='his_order_goods2_part_id_fa'
    if (SELECT count(*) FROM sys.partition_functions  where name=@SchemeName)<=0
    begin
        --创建文件组语句
        ALTER DATABASE DB3 ADD FILEGROUP [wjz_part_01]

        --创建文件语句
        ALTER DATABASE DB3 ADD FILE ( NAME = N'F01_part', FILENAME = N'D:\DB3\F01_part.ndf' , SIZE = 100MB , FILEGROWTH = 500MB ) TO FILEGROUP [wjz_part_01]

        --创建分区函数
        CREATE PARTITION FUNCTION his_order_goods2_part_id_func(bigint)
        AS RANGE right FOR VALUES 
        (
        @FQROWS
        );

        --创建分区方案
        CREATE PARTITION SCHEME his_order_goods2_part_id_fa
        AS PARTITION his_order_goods2_part_id_func
        TO (
        [PRIMARY],
        [wjz_part_01]
        );
    end
    return 1

END;
 

可以自动新增文件组和文件的存储过程

USE [DB3]
GO
/****** Object:  StoredProcedure [dbo].[FQ_DB3_his_order_goods2_part_ID]    Script Date: 2024/7/11 17:35:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- exec  FQ_DB3_his_order_goods2_part_ID
--每新增@FQROWS(500000)条记录新增一个文件和文件组
CREATE PROCEDURE [dbo].[FQ_DB3_his_order_goods2_part_ID]
AS
BEGIN
--BEGIN TRANSACTION
    DECLARE @FilePath VARCHAR(100),                      --文件路径
            @FileName VARCHAR(100),                      --文件名称
            @FileSize VARCHAR(100),                      --文件大小
            @FileGrowth VARCHAR(100),                    --文件增长
            @FileMaxLimit VARCHAR(100),                  --文件最大限制
            @FileGroupName VARCHAR(100),                 --文件组名称
            @Database VARCHAR(100),                      --操作数据库
            @CurrentNum VARCHAR(2), --当前新分区计数
            @SchemeName VARCHAR(100),                    --分区方案名称
            @PartitionName VARCHAR(100),                 --分区函数名称
            @FQROWS  int=100000,   --每给分区文件放的记录数 默认 500000
            @sql VARCHAR(400);    -- 赋值文件属性
    SET @FileSize = '8MB';
    SET @FileGrowth = '1MB';
    SET @FileMaxLimit = 'unlimited';
    -- 赋值分区属性
    SET @SchemeName = 'his_order_goods2_part_id_fa';   --'cti_IDFQ_Scheme'; 分区方案名称
    SET @PartitionName ='his_order_goods2_part_id_func()'; --   'cti_IDFQ_Func()';  分区函数名称

    declare @rows as int
    select @rows=count(*) from his_order_goods2_part;
    print @rows

 --   --没有为当前表创建分区和分区函数
    --SELECT count(*) FROM sys.partition_functions  where name='his_order_goods2_part_id_fa'
    --if (SELECT count(*) FROM sys.partition_functions  where name=@SchemeName)<=0
    --begin
    --    --创建文件组语句
    --    ALTER DATABASE DB3 ADD FILEGROUP [wjz_part_01]

    --    --创建文件语句
    --    ALTER DATABASE DB3 ADD FILE ( NAME = N'F01_part', FILENAME = N'D:\DB3\F01_part.ndf' , SIZE = 100MB , FILEGROWTH = 500MB ) TO FILEGROUP [wjz_part_01]

    --    --创建分区函数
    --    CREATE PARTITION FUNCTION his_order_goods2_part_id_func(bigint)
    --    AS RANGE right FOR VALUES 
    --    (
    --    @CurrentNum
    --    );

    --    --创建分区方案
    --    CREATE PARTITION SCHEME his_order_goods2_part_id_fa
    --    AS PARTITION his_order_goods2_part_id_func
    --    TO (
    --    [PRIMARY],
    --    [wjz_part_01]
    --    );
    --end

    --获取分区数 并根据记录数判断是否新建
    declare @fqs as int=0
    SELECT @fqs=count(*)+1 FROM sys.partition_range_values
    where function_id=(SELECT function_id FROM sys.partition_functions where name='his_order_goods2_part_id_func');
    print @fqs
    --当 分区数*设置的分区记录数(500000)<表的总行数 添加一个文件
    if @fqs*@FQROWS<@rows
    begin
        set @CurrentNum=cast(@fqs+1 as VARCHAR(2));
        print '新增分区文件和文件组'
        SET @FileName = 'dbfn_part' + @CurrentNum;
        SET @FilePath = 'D:\DB3';
        -- 赋值数据库属性
        SET @Database = '[DB3]';
        -- 赋值文件组属性
        SET @FileGroupName = 'fg_part' + @CurrentNum;
        -- 创建文件组
        SET @sql = 'alter database ' + @Database + ' add filegroup ' + @FileGroupName + '';
        EXEC (@sql);
        -- 创建文件,并绑定文件组
        SET @sql = 'alter database ' + @Database + ' add file (name=''' + @FileName + ''',' + 'filename=''' + @FilePath + '\'
              + @FileName + '.ndf'',' + 'size = ' + @FileSize + ',' + 'filegrowth = ' + @FileGrowth + ',' + 'maxsize = '
              + @FileMaxLimit + '' + ')' + 'to filegroup ' + @FileGroupName;
        EXEC (@sql);
        -- 修改分区方案
        SET @sql = 'alter partition scheme ' + @SchemeName + ' next used ' + @FileGroupName + '';
        EXEC (@sql);
        -- 修改分区函数
        print '@CurrentNum'
        print @CurrentNum
        print @FQROWS
        declare @range_val int=cast(@CurrentNum as int)*@FQROWS;
        print @range_val
        declare @str_range_val varchar(10)
        set @str_range_val=cast(@range_val as varchar(10))
        print @str_range_val
        --SET @sql = 'alter partition function ' + @PartitionName + ' split range (N''' +CONVERT(VARCHAR(10), getdate(), 120)+''')'    
        SET @sql = 'alter partition function ' + @PartitionName + ' split range (cast(' + @str_range_val+ ' as int) )'
        print @sql
        EXEC (@sql);
    end
    else
    begin
       print '不新增'
    end
    return 1

--COMMIT TRANSACTION
END;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值