--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')

MSSQL 将大表改成已分区表的更多相关文章

  1. Oracle大表改为分区表及表空间切换方案

    Oracle大表改为分区表及表空间切换方案 一.            背景 由于之前数据库表和索引放在一个表空间导致表空间数据文件增长太快,文件数量即将达到Oracle表空间的限制,需要对表(没有分 ...

  2. SQL Server 2005中的分区表(六):将已分区表转换成普通表(转)

    我的俄罗斯名叫作“不折腾不舒服斯基”,所以,不将分区表好好折腾一下,我就是不舒服. 在前面,我们介绍过怎么样直接创建一个分区表,也介绍过怎么将一个普通表转换成一个分区表.那么,这两种方式创建的表有什么 ...

  3. Mysql大表查询优化技巧总结及案例分析

    http://www.169it.com/article/3219955334.html     sql语句使用基本原则:1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 orde ...

  4. [记录]一则清理MySQL大表以释放磁盘空间的案例

    一则清理MySQL大表以释放磁盘空间的案例 一.基本情况: 1.dbtest库554G,先清理st_online_time_away_ds(37G)表的数据,保留半年的数据: 1)删除的数据:sele ...

  5. SQL Server单表已700w+将普通表转换成分区表1

    最近项目中,某个表数据量爆发时增长,单表已700w+,读写性能急剧下降,所以考虑加入分区表以解燃眉之急,后续还是要分表分库,当然这是后话.下面简要说一下将普通表转为分区表的步骤.   一.创建文件组 ...

  6. SQL Server单表已700w+将普通表转换成分区表

    最近项目中,某个表数据量爆发时增长,单表已700w+,读写性能急剧下降,所以考虑加入分区表以解燃眉之急,后续还是要分表分库,当然这是后话.下面简要说一下将普通表转为分区表的步骤.   一.创建文件组 ...

  7. 把sql server 2000的用户表的所有者改成dbo

    怎么样把sql server 2000的用户表的所有者,改成dbo,而不是用户名. 推荐使用下面介绍的第二种方法,执行以下查询便可以了.sp_configure 'allow updates','1' ...

  8. 走向DBA[MSSQL篇] 针对大表 设计高效的存储过程【原理篇】 附最差性能sql语句进化过程客串

    原文:走向DBA[MSSQL篇] 针对大表 设计高效的存储过程[原理篇] 附最差性能sql语句进化过程客串 测试的结果在此处 本篇详解一下原理 设计背景 由于历史原因,线上库环境数据量及其庞大,很多千 ...

  9. ORACLE普通表转换成分区表

    转http://mp.weixin.qq.com/s?__biz=MzAwMjkyMjEwNg==&mid=2247484761&idx=1&sn=ce080581145931 ...

随机推荐

  1. 【Android】解析Android的路径

    目录结构: contents structure [+] 内部路径 外部路径 Assets目录 Android中的路径主要分为内部路径和外部路径. 一.内部路径 常见的内部存储路径有: File f1 ...

  2. 转: 如何使用jstack分析线程状态

    这个讲的好系列:  如何使用jstack分析线程状态 转:http://www.jianshu.com/p/6690f7e92f27 背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于 ...

  3. 完美的代码生成器SNF.CodeGenerator-快速开发者的利器--SNF快速开发平台3.1

    第1章 SNF.CodeGenerator代码生成器简介 本项目是完全基于Spring.Net.Framework 平台进行研发.与Spring.Net.Framework平台无缝衔接.并支持模型层. ...

  4. jmeter源码导入eclipse并完成编译

    其次是去ant官网下载最新版的ant二进制包,安装ant,并配置环境变量ANT_HOME,Path:验证安装是否成功: apache-jmeter-3.0的要求). 1.在eclipse中新建java ...

  5. Selenium Web 自动化 - Selenium(Java)环境搭建

    Selenium Web 自动化 - Selenium(Java)环境搭建 2016-07-29 1 下载JDK JDK下载地址:http://www.oracle.com/technetwork/j ...

  6. Current online Redo 和 Undo 损坏的处理方法

    转自:http://blog.csdn.net/tianlesoftware/article/details/6261475 Oracle 不同故障的恢复方案 http://blog.csdn.net ...

  7. Node入门教程(8)第六章:path 模块详解

    path 模块详解 path 模块提供了一些工具函数,用于处理文件与目录的路径.由于windows和其他系统之间路径不统一,path模块还专门做了相关处理,屏蔽了彼此之间的差异. 可移植操作系统接口( ...

  8. oracle结合mybatis批量插入数据

    先上代码: controller: result = service.insertTRbXdhjLendYdData(params); service: List<TRbXdhjLendDTO& ...

  9. 【发布iCore3&iCore4ADM资料】

    资料包说明: 1.解压资料包,里面有两个文件夹,iCore3和iCore4. iCore3文件夹里包含源代码及AD模块的详细资料. iCore4文件夹里仅有源代码,AD模块的详细资料参考iCore3里 ...

  10. 简单网络搭建与测试 mininet

    简介 本实验是基于pox搭建简单的网络并测试网络的连通性,利用mininet代码创建一个交换机四个主机的拓扑,测试各主机之间的连通性以及h1.h4之间的带宽. 代码 实验代码如下所示,SingleSw ...