sql server 按月对数据表进行分区
当某张数据表数据量较大时,我们就需要对该表进行分区处理,以下sql语句,会将数据表按月份,分为12个分区表存储数据,废话不多说,直接上脚本:
use [SIT_L_TMS] --开启 XP_CMDSHELL;开启创建文件夹权限
GO
SP_CONFIGURE 'SHOW ADVANCED OPTIONS',1
RECONFIGURE
GO
SP_CONFIGURE 'XP_CMDSHELL',1
RECONFIGURE
GO --数据库名
declare @servername varchar(20) ;
-- 变量赋值
set @servername = 'SIT_L_TMS' ; --待执行sql
declare @sql varchar(1024) ; --设置年
declare @year varchar(10);
set @year = CONVERT(varchar(4), GETDATE(), 23);
--月数
declare @summonths int;
set @summonths = 12; --文件组存放路径
declare @file_path varchar(200);
set @file_path = 'F:\db_group\' + @year; --判断文件夹是否存在,不存在则创建
declare @TEMP TABLE(A INT,B INT,C INT);--建立虚拟表,用来判断文件夹是否存在
INSERT @TEMP EXEC [MASTER]..XP_FILEEXIST @file_path;
IF NOT EXISTS(SELECT * FROM @TEMP WHERE B=1)
BEGIN
--XP_CMDSHELL不允许使用变量拼接,所以使用exec方法
declare @EX NVARCHAR(255)
SET @EX = 'EXEC XP_CMDSHELL ''MKDIR ' + @file_path + '''';
EXEC(@EX)
END --文件组名
declare @filegroupname varchar(50);
--文件组路径:完整路径,含文件名
declare @filegrouppath varchar(300); --分区函数
declare @partition_func varchar(128) ;
set @partition_func = 'l_tms_partition_func'; --分区结构
declare @partition_scheme varchar(128) ;
set @partition_scheme = 'l_tms_partition_scheme'; --时间
declare @datetime varchar(10);
--按时间分区语句
declare @fuction_sql varchar(1024);
--按时间分区结构
declare @scheme_sql varchar(1024); --建立12个分区
declare @i int;
set @i = 1;
while @i<(@summonths+1)
begin
declare @date varchar(10) if @i < 10
begin
set @date = '0' + convert(varchar,@i);
end
else
begin
set @date = convert(varchar,@i);
end -- 添加文件组名;文件组名按日期:例如20180401
set @datetime = @year + @date;
set @filegroupname = 'Group' + @year + @date;
set @sql = 'alter database ' + @servername + ' add filegroup '+ @filegroupname;
print @sql;
exec(@sql); --将文件组名与文件关联
set @filegrouppath = @file_path + '\' + @filegroupname + '.ndf';
set @sql = 'alter database '+ @servername + ' add file (name=N'''+ @filegroupname +''',filename=N'''+ @filegrouppath +''',size=5Mb,filegrowth=5mb) to filegroup '+ @filegroupname;
print @sql;
exec(@sql); --拼接按时间分区函数/拼接按时间分区结构
if @i = 1
begin
set @fuction_sql = '''' + @datetime + '01 23:59:59' + '''' + ',';
set @scheme_sql = '['+ @filegroupname +']' + ',';
end
else if @i = 12
begin
set @fuction_sql = @fuction_sql + '''' + @datetime + '01 23:59:59' + '''';
set @scheme_sql = @scheme_sql + '['+ @filegroupname +']';
end
else
begin
set @fuction_sql = @fuction_sql + '''' + @datetime + '01 23:59:59' + '''' + ',';
set @scheme_sql = @scheme_sql + '['+ @filegroupname +']' + ',';
end set @i = @i + 1; end -- 创建分区函数
set @sql = 'create partition function '+ @partition_func +'(DATETIME) as range left for values('+ @fuction_sql+')';
print @sql;
exec(@sql); -- 创建分区结构(将分区函数和分区组对应起来)
set @sql = 'create partition scheme '+ @partition_scheme +' as partition '+ @partition_func +' to(' + @scheme_sql + ',[Primary])';
print @sql;
exec(@sql); --将普通表转换为分区表
--删除主键
ALTER TABLE [dbo].[TMS_RealTimeEqptInfo] DROP constraint PK_TMS_RealTimeEqptInfo
--创建主键,但不设为聚集索引
ALTER TABLE [dbo].[TMS_RealTimeEqptInfo] ADD constraint PK_TMS_RealTimeEqptInfo PRIMARY KEY NONCLUSTERED
(
[ID] ASC
)ON [PRIMARY] --创建一个新的聚集索引,并在该聚集索引中使用分区方案;注意修改分区方案的名字,按字段WriteTime进行分区
CREATE CLUSTERED INDEX CT_RealTimeData on TMS_RealTimeEqptInfo([WriteTime])
ON etm_partition_scheme([WriteTime])
数据库名称和数据表名称自行对应修改。
sql server 按月对数据表进行分区的更多相关文章
- sql Server中临时表与数据表的区别
sql server 中临时表与数据表的区别 1.如何判断临时表和数据表已生成 --如何判断临时表是否已创建--- if exists(select * from tempdb..sysobjects ...
- 转:Sql Server中清空所有数据表中的记录
如果要删除数据表中所有数据只要遍历一下数据库再删除就可以了,清除所有数据我们可以使用搜索出所有表名,构造为一条SQL语句进行清除了,这里我一一给各位同学介绍. 使用sql删除数据库中所有表是不难的 ...
- Sql Server中清空所有数据表中的记录
Sql Server中清空所有数据表中的记录 清空所有数据表中的记录: 代码如下:exec sp_msforeachtable @Command1 ='truncate table ?'删除所有数据 ...
- SQL Server 创建和修改数据表
一.CREATE语句(创建) 1.创建DataBase 1.CONTAINMENT SQL Server 2012 新功能 , 默认值是OFF .(太高级 书上也没有详细介绍). 2.ON ON用于两 ...
- SQL Server 创建 修改 删除数据表
1. 图形界面方式操作数据表 (1)创建和修改数据表 列名中如果有两个以上单词时,最好用下划线连接,否则可能会给将来的查询维护带来不便.我们公司美国佬做的数据库就很烦,所有列名都有空格,一旦忘记用方括 ...
- 【转载】SQL Server - 使用 Merge 语句实现表数据之间的对比同步
原文地址:SQL Server - 使用 Merge 语句实现表数据之间的对比同步 表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT ...
- Oracle和sql server中复制表结构和表数据的sql语句
在Oracle和sql server中,如何从一个已知的旧表,来复制新生成一个新的表,如果要复制旧表结构和表数据,对应的sql语句该如何写呢?刚好阿堂这两天用到了,就顺便把它收集汇总一下,供朋友们参考 ...
- sql server的数据库个数、表个数及表的数据量统计
sql server的数据库个数.表个数及表的数据量统计 --由于今天要监控数据,急需统计实例中1有多少库2库里有多少表3每个表有多少数据 --将写好的代码贴出来,用到如下的: --sysobje ...
- 使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历
原文:使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历 常常遇到需要向SQL Server插入批量数据,然后在存储过程中对这些数据进行进一步处理的情况.存储过 ...
随机推荐
- c#中的结构
1.在c#中,结构是值类型的数据结构,它可以使用一个单一的变量存储各种数据类型的相关数据,使用Struct关键字进行声明. 2.C#中结构的特点: (1)结构中可以有字段,属性,方法,运算表达式,事件 ...
- WAPM环境配置(PHP入门2)
WAMP介绍 W:Window:开源免费 A:Apache:开源免费 M:MySQL:开源免费 P:PHP:开源免费 Apache下载 Apache下载地址:https://www.apachehau ...
- Oracle特殊查询 行列倒转 分页
--查询工资最高的前三名 (分页的感觉)select * from(select * from emp order by sal desc) twhere rownum <=3--查询工资最高的 ...
- angular的生命周期
什么是生命周期 生命周期函数通俗的讲就是组件创建.组件更新.组件销毁的时候会触发的一系列的方法. 当 Angular 使用构造函数新建一个组件或指令后,就会按下面的顺序在特定时刻调用这些 生命周期钩子 ...
- JS判断两个数字的大小
javascript中定义的var类型是弱类型,默认是String类型,在比较两个数字大小的时候默认比较的是两个字符串,比如,在比较10和2时,按数字做比较10是比2大,可是按默认的字符串比较时,第一 ...
- TCP中的三次握手和四次挥手
三次握手:目的是同步连接双方的序列号和确认号 并交换 TCP窗口大小信息. 理论上跟通话一样: a: 你听的到吗? b: 我能听到.只需要两次就可以了,但建立连接阶段不是双向即时通信的,且最终的目的 ...
- Hadoop相关笔记
一. Zookeeper( 分布式协调服务框架 ) 1. Zookeeper概述和集群搭建: (1) Zookeeper概述: Zookeeper 是一个分布式 ...
- Windows环境下写Linux sh脚本的一次挖坑和填坑
最近在研究Docker集群和安装的时候,需要准备若干台机器.所以我为节约时间,打算批量复制VM机器,然后用sh脚本命令执行机器名称和IP等基础配置信息的修改. 具体操作:我在windows环境下,用N ...
- TF-IDF介绍
TF-IDF是什么 TF-IDF是一种统计方法,用以评估一个词对于一篇文章或语料库中一篇文章的重要性.字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降. T ...
- 大数据:spark集群搭建
创建spark用户组,组ID1000 groupadd -g 1000 spark 在spark用户组下创建用户ID 2000的spark用户 获取视频中文档资料及完整视频的伙伴请加QQ群:9479 ...