• MSSQL 将大表改成已分区表


    --select * from sys.partition_functions
    --select * from sys.partition_range_values
    use [UpdateLog]
    go
    CREATE TABLE [dbo].[ActionLog](
        [Guid] [nvarchar](100) NOT NULL,
        [ActCode] [nvarchar](50) NULL,
        [ActSubCode] [nvarchar](50) NULL,
        [ActTime] [datetime] NULL,
        [ActInfo] [nvarchar](250) NULL,
        [ActType] [int] NULL,
        [KeyNum] [nvarchar](100) NULL,
        [IPAddress] [nvarchar](100) NULL,
        [MacAddress] [nvarchar](100) NULL,
        [OSVersion] [nvarchar](50) NULL,
        [OSBit] [nvarchar](50) NULL,
        [MemSize] [float] NULL,
        [CPUInfo] [nvarchar](50) NULL,
        [SoftName] [nvarchar](50) NULL,
        [OEMVersion] [nvarchar](50) NULL,
        [SoftBit] [nvarchar](50) NULL,
        [SoftVersion] [nvarchar](50) NULL,
        [AuthorType] [nvarchar](50) NULL,
        [UploadTime] [datetime] NOT NULL,
    ) ON UpdateLog_partition_scheme(UploadTime)
    
    ALTER TABLE [ActionLog]
       ADD CONSTRAINT [PK_ActionLog] PRIMARY KEY NONCLUSTERED 
    (
        [Guid] ASC,[UploadTime] ASC
    )
    go
    CREATE CLUSTERED INDEX ix_ActionLog_UploadTime
    ON [ActionLog]([UploadTime])
    go
    
    CREATE TABLE [dbo].[UpdateLogs](
        [AutoKey] [int] IDENTITY(1,1) NOT NULL,
        [ActName] [varchar](200) NULL,
        [HostName] [varchar](200) NULL,
        [IP] [varchar](20) NULL,
        [OpDate] [varchar](50) NULL,
        [OpTime] [datetime]  NOT NULL,
        [RetCode] [int] NULL,
        [SN] [varchar](100) NULL,
        [SoftName] [varchar](200) NULL,
        [SoftVer] [varchar](50) NULL,
        [IPAddress] [nvarchar](500) NULL,
        [YearNum] [int] NULL,
        [MonthNum] [int] NULL,
        [DayNum] [int] NULL,
    )ON UpdateLog_partition_scheme(OpTime)
    go
    
    ALTER TABLE [UpdateLogs]
       ADD CONSTRAINT [PK_UpdateLogs] PRIMARY KEY NONCLUSTERED 
    (
        [AutoKey] ASC,[OpTime] ASC
    )
    go
    CREATE CLUSTERED INDEX ix_UpdateLogs_OpTime
    ON [UpdateLogs]([OpTime])
    go
    
    --select convert(varchar(50), ps.name) as partition_scheme,
    --p.partition_number, 
    --convert(varchar(10), ds2.name) as filegroup, 
    --convert(varchar(19), isnull(v.value, ''), 120) as range_boundary, 
    --str(p.rows, 9) as rows       
    --from sys.indexes i 
    --join sys.partition_schemes ps on i.data_space_id = ps.data_space_id 
    --join sys.destination_data_spaces dds
    --on ps.data_space_id = dds.partition_scheme_id 
    --join sys.data_spaces ds2 on dds.data_space_id = ds2.data_space_id 
    --join sys.partitions p on dds.destination_id = p.partition_number
    --and p.object_id = i.object_id and p.index_id = i.index_id 
    --join sys.partition_functions pf on ps.function_id = pf.function_id 
    --LEFT JOIN sys.Partition_Range_values v on pf.function_id = v.function_id
    --and v.boundary_id = p.partition_number - pf.boundary_value_on_right 
    --WHERE i.object_id = object_id('ActionLog')
    --and i.index_id in (0, 1) 
    --order by p.partition_number
    
    --select convert(varchar(50), ps.name) as partition_scheme,
    --p.partition_number, 
    --convert(varchar(10), ds2.name) as filegroup, 
    --convert(varchar(19), isnull(v.value, ''), 120) as range_boundary, 
    --str(p.rows, 9) as rows       
    --from sys.indexes i 
    --join sys.partition_schemes ps on i.data_space_id = ps.data_space_id 
    --join sys.destination_data_spaces dds
    --on ps.data_space_id = dds.partition_scheme_id 
    --join sys.data_spaces ds2 on dds.data_space_id = ds2.data_space_id 
    --join sys.partitions p on dds.destination_id = p.partition_number
    --and p.object_id = i.object_id and p.index_id = i.index_id 
    --join sys.partition_functions pf on ps.function_id = pf.function_id 
    --LEFT JOIN sys.Partition_Range_values v on pf.function_id = v.function_id
    --and v.boundary_id = p.partition_number - pf.boundary_value_on_right 
    --WHERE i.object_id = object_id('UpdateLogs')
    --and i.index_id in (0, 1) 
    --order by p.partition_number
    --DROP PARTITION SCHEME UpdateLog_partition_scheme
    --DROP PARTITION function UpdateLog_partition_func
    
    IF    OBJECT_ID(N'tempdb.dbo.#Tab_Partition_Fun') IS NOT NULL
    BEGIN
        DROP TABLE #Tab_Partition_Fun
    END
    create table #Tab_Partition_Fun(
        fun_val_date datetime
    )
    
    INSERT INTO #Tab_Partition_Fun(fun_val_date)
    values('2000-01-01 00:00:00'),
    ('2016-01-01 00:00:00'),
    ('2017-01-01 00:00:00'),
    ('2017-02-01 00:00:00'),
    ('2017-03-01 00:00:00'),
    ('2017-04-01 00:00:00'),
    ('2017-05-01 00:00:00'),
    ('2017-06-01 00:00:00'),
    ('2017-07-01 00:00:00'),
    ('2017-08-01 00:00:00'),
    ('2017-09-01 00:00:00'),
    ('2017-10-01 00:00:00'),
    ('2017-11-01 00:00:00'),
    ('2017-12-01 00:00:00'),
    ('2018-01-01 00:00:00'),
    ('2018-02-01 00:00:00'),
    ('2018-03-01 00:00:00'),
    ('2018-04-01 00:00:00'),
    ('2018-05-01 00:00:00'),
    ('2018-06-01 00:00:00'),
    ('2018-07-01 00:00:00')
     
     
    -- 文件组变量声明
    declare @servername varchar(20) ;
    declare @filegroup varchar(64) ;
    -- 分组文件路径
    declare @filegname varchar(300) ;
    
    declare @sql varchar(1024) ;
    
    declare @filenameprefix varchar(32);
    declare @filedir varchar(1024) ;
     
    declare @partition_func varchar(128) ;
    declare @partition_scheme varchar(128) ;
    
    declare @fun_val_date datetime
    
    declare @EveyMonth varchar(6)
     
    -- 变量赋值
    set @servername = 'UpdateLog' ;
    -- 文件名前缀
    set @filenameprefix = 'UpdateLogPart' ;
    -- 文件路径
    set @filedir = 'D:sqldata';
    -- 分区函数
    set @partition_func = 'UpdateLog_partition_func';
    -- 分区结构
    set @partition_scheme = 'UpdateLog_partition_scheme';
    
    set @sql = 'use '+ @servername;
    print @sql;
    exec(@sql);
    
    declare @filegroupArr varchar(8000)
    declare @fun_valArr varchar(8000)
    set @filegroupArr=''
    set @fun_valArr=''
    
    declare auth_cur cursor for
    select fun_val_date from #Tab_Partition_Fun
    open auth_cur
    fetch next from auth_cur into @fun_val_date
    while (@@fetch_status=0)
      begin
      set @EveyMonth=left(convert(varchar,dateadd(ss,-1,@fun_val_date),112),6);
        set @filegroup = @filenameprefix+'Group'+@EveyMonth;
        set @filegname=@filenameprefix+@EveyMonth+ '.ndf';
    
        -- 添加文件组名
        set @sql = 'alter database ' + @servername + ' add filegroup '+ @filegroup;
        print @sql;
        exec(@sql);
     
        -- 将文件组与文件名绑定
        set @sql = 'alter database '+ @servername + ' add file (name=N'''+@filegroup+''',filename=N'''+@filedir+@filegname+''',size=5Mb,filegrowth=5mb) to filegroup '+@filegroup;
        print @sql;
        exec(@sql);
    
        set @filegroupArr=@filegroupArr+''''+CONVERT(varchar(100),  dateadd(ss,-1,@fun_val_date), 21)+''','
        set @fun_valArr=@fun_valArr+'['+@filegroup+'],'
    
        fetch next from auth_cur into @fun_val_date
      end
    close auth_cur
    deallocate auth_cur
    
     set @filegroupArr=left(@filegroupArr,len(@filegroupArr)-1)
     set @fun_valArr=left(@fun_valArr,len(@fun_valArr)-1)
    
     print @filegroupArr
     print @fun_valArr
    -- 创建分区函数
    set @sql = 'create partition function '+ @partition_func +'(DATETIME) as range left for values('+@filegroupArr+')';
    print @sql;
    exec(@sql);
     
    -- 创建分区结构(将分区函数和分区组对应起来)
    set @sql = 'create partition scheme '+ @partition_scheme +' as partition '+ @partition_func +' to('+@fun_valArr+',[Primary])';
    print @sql;
    exec(@sql);

    第三个建立自动建分区

    USE [UpdateLog]
    GO
    /****** Object:  StoredProcedure [dbo].[sp_CreatePartitionTabel]    Script Date: 2018/7/25 13:43:08 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[sp_CreatePartitionTabel]
    AS
    BEGIN
        
        declare @servername varchar(20) ;
    declare @sql varchar(1000);
    declare @filenameprefix varchar(32);
    
    declare @filedir varchar(1024) ;
     
    declare @partition_func varchar(128) ;
    declare @partition_scheme varchar(128) ;
    declare @cur_date varchar(128) ;
    
    declare @EveyMonth varchar(6);
    declare @filegroup varchar(200);
    declare @filegname varchar(200);
     
    -- 服务器名称
    set @servername = 'UpdateLog' ;
    -- 文件名前缀
    set @filenameprefix = 'UpdateLogPart' ;
    -- 文件路径
    set @filedir = 'D:sqldata';
    -- 分区函数
    set @partition_func = 'UpdateLog_partition_func';
    -- 分区结构
    set @partition_scheme = 'UpdateLog_partition_scheme';
    
    set @cur_date=dateadd(MM,1,GETDATE());
    -- 文件组
    set @EveyMonth = left(convert(varchar,dateadd(ss,-1,@cur_date),112),6);
    set @filegroup =  @filenameprefix+'Group'+@EveyMonth;
    set @filegname=@filenameprefix+@EveyMonth+ '.ndf';
    
    ---- 添加文件组
    set @sql = 'alter database '+@servername+' add fileGroup '+@filegroup;
    print @sql;
    exec(@sql);
    
    -- 将文件组与文件名绑定
    set @sql = 'alter database '+ @servername + ' add file (name=N'''+@filegroup+''',filename=N'''+@filedir+@filegname+''',size=5Mb,filegrowth=5mb) to filegroup '+@filegroup;
    print @sql;
    exec(@sql);
     
    -- 修改分区方案,用一个新的文件组用于存放下一新增的数据
    set @sql='alter partition scheme '+ @partition_scheme +' next used  '+@filegroup;
    print @sql;
    exec(@sql);
     
    -- 分区函数
    set @sql= 'alter partition function ' + @partition_func  +'() split range (''' + CONVERT(varchar(100),  dateadd(ss,-1,@cur_date), 21)+''')';
    print @sql;
    exec(@sql);
    
    
    END

    利用SQL代理建立作业执行上面的存储过程

    定时作业的制定 
     
    企业管理器  
    --管理  
    --SQL Server代理  
    --右键作业  
    --新建作业  
    --"常规"项中输入作业名称  
    --"步骤"项  
    --新建  
    --"步骤名"中输入步骤名  
    --"类型"中选择"Transact-SQL 脚本(TSQL)"  
    --"数据库"选择执行命令的数据库  
    --"命令"中输入要执行的语句:  
                           EXEC 存储过程名 ... --该存储过程用于创建表  
     
    --确定  
    --"调度"项  
    --新建调度  
    --"名称"中输入调度名称  
    --"调度类型"中选择你的作业执行安排  
    --如果选择"反复出现"  
    --点"更改"来设置你的时间安排   
     
     
    然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行  
     
    设置方法:  
    我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.  

    如果数据库代理意外关闭导至自己分区没有执行,当发现时可能晚了造成默认数据库文件特别大处理方法如下:

    --1、补全之前的文件组
    --2、新建数据库文件与对应有文件组对应起,注意文件路及文件名
    --3、修改分区方案,注意:从前往后一个个设置
    alter partition scheme UpdateLog_partition_scheme next used UpdateLogPartGroup201811 ;
    --4、修改分区函数
    alter partition function [UpdateLog_partition_func]() split range ('2018-11-30T23:59:59.000')
  • 相关阅读:
    Leetcode & CTCI ---Day 4
    Leetcode & CTCI ---Day 3
    Leetcode & CTCI ---Day 2
    Leetcode & CTCI ---Day 1
    编码格式坑之UTF-8
    15. 3Sum
    第十六周助教总结-第二组
    第十五周助教总结-第二组
    第十四周助教总结-第二组
    第十三周助教总结-第二组
  • 原文地址:https://www.cnblogs.com/xiaoruilin/p/9365525.html
Copyright © 2020-2023  润新知