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插入批量数据,然后在存储过程中对这些数据进行进一步处理的情况.存储过 ...
随机推荐
- disconf实践(三)基于XML的分布式配置文件管理,自动reload
上一篇介绍了基于xml的非自动reload的分布式配置文件管理,这一篇介绍自动reload的方式(基于disconf实践二). 1. 修改RedisConfig.java package org.sp ...
- Shell笔记-04
如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. 举个例子: #!/bin/bash a=10 echo -e "Value ...
- 安卓 通过www读取Application.persistentDataPath
今天在读取Application.persistentDataPath路径下的图片时,在前面加上“file:///” 例如 #if UNITY_EDITOR || UNITY_STANDALONE r ...
- CentOS7 搭建RabbitMQ集群 后台管理 历史消费记录查看
简介 通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接 ...
- Oracle ddl 和 dml 操作
ddl 操作 窗口设置用户权限的方法 Oracle的数据类型 按住Ctrl点击表名 ,可以鼠标操作 插入的数据需要满足创建表的检查 主表clazz删除数据从表设置级联也会一同删除 有约束也 ...
- (Les17 移动数据)expdp/impdp
oracle 11.2.0 expdp/impdp 数据泵参数 expdp参数=========================================================== ...
- JAVA WEB 前台实时监控后台程序运行
基本思路: 1. 操作状态在类中以静态变量方式(或公共类存储公共变量方式,SESSION方式.COOKIE方式)存在 2. 前台采用AJAX方式激发后台进行业务逻辑操作,并实时更新操作状态信息 3. ...
- 执行 sql 报错未缓冲查询,错误码 2014
sql语句为 SELECT COUNT(id) AS tp_count FROM `tableName` WHERE `status` = 0 AND `source` = 1 AND ( `end_ ...
- Windows环境下写Linux sh脚本的一次挖坑和填坑
最近在研究Docker集群和安装的时候,需要准备若干台机器.所以我为节约时间,打算批量复制VM机器,然后用sh脚本命令执行机器名称和IP等基础配置信息的修改. 具体操作:我在windows环境下,用N ...
- WebGl 旋转(矩阵变换)
代码1: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...