SQL server计划任务分区并按照年月作为文件目录实现分类管理

近期需要对数据量较大的表进行数据分区,但是若按照150W条数据进行分区,需要三天创建一个ndf文件,一年120个文件存放在一个文件夹中不方便进行文件管理。经过一下午的查阅资料,将以下两篇文章所提到的内容进行综合利用,实现按照年份和月份进行分类存放的SQL定时数据分区。

使用过程中碰到以下问题:

dir 命令当路径中存在空格‘ ’时会报错,若路径存在空格时用双引号""将路径包含起来即可

本文主要参考:

http://www.cnblogs.com/linjt0416/articles/5666235.html           SQL计划实现自动数据分区

http://www.cnblogs.com/linjt0416/articles/5667111.html           SQL查找路径是否存在,不存在则创建

/*--------------------创建数据库的文件组和物理文件------------------------*/
use master
go
 --//1,涉及安全问题,(用DBO权限用户)开启使用xp_cmdshell存储过程的权限
--SQL Server blocked access to procedure ‘xp_cmdshell‘
sp_configure ‘show advanced options‘, 1
go
reconfigure --重新配置
go
sp_configure ‘xp_cmdshell‘, 1
go
reconfigure
go  

--//2,建立临时表保存临时信息
--if not exists(select * from tempdb..sysobjects where id=OBJECT_ID(‘tempdb..#tb01‘)) --ok
--if not exists(select * from tempdb..sysobjects where id=OBJECT_ID(‘tempdb..#tb01‘) and type=‘U‘) --ok
if (OBJECT_ID(‘tempdb..#tb01‘) is not null)
drop table #tb01  --drop table tempdb..#tb01 --ok too
create table #tb01([dosCMDResult] varchar(4000)) --save DOS cmd result  

declare @tableName varchar(50), @fileGroupName varchar(50), @ndfName varchar(50), @newNameStr varchar(50), @fullPath 

varchar(250), @newDay varchar(50), @oldDay datetime, @partFunName varchar(50), @schemeName varchar(50) ,@year varchar(50) ,@month varchar(50),@path varchar(250)
,  @dosCMD varchar(50) , @cmdLine varchar(4000)
set @tableName=‘DC_WATER‘
set @newDay=CONVERT(varchar(100), GETDATE(), 23)--23:按天 114:按时间
set @oldDay=cast(CONVERT(varchar(10),dateadd(day,-1,getdate()), 120 ) as datetime)
set @newNameStr=Replace(Replace(@newDay,‘:‘,‘_‘),‘-‘,‘_‘)
set @fileGroupName=N‘G‘+@newNameStr+‘_test‘
set @ndfName=N‘F‘+@newNameStr+‘_test‘
set @year= DATEPART(YY,GETDATE())
set @month=REPLICATE(‘0‘,2-LEN(DATEPART(MM,GETDATE())))+convert(varchar(10),(DATEPART(MM,GETDATE())))
--上面两处修改文件组和文件名称
set @path=N‘"C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\‘+@year+‘\‘+@month+‘\"‘
set @fullPath=@path+@ndfName+‘.ndf‘

set @dosCMD = ‘dir ‘ --dos cmd
set @cmdLine = @dosCMD+@path
insert into #tb01 exec master..xp_cmdshell @cmdLine
select * from #tb01
if exists(select 1 from #tb01 where dosCMDResult in (‘系统找不到指定的文件。‘,‘找不到文件‘,‘系统找不到指定的路径。‘)) --路径不存在
begin
    set @dosCMD = ‘md ‘
    set @cmdLine = @dosCMD + @path
    exec master..xp_cmdshell @cmdLine
    --更多操作,比如在指定路径下建立某数据库,然后建立相关表等等
end
else  --路径存在
begin
    print char(13)+‘路径:‘ + @path + ‘ 已经存在‘
end  

--//4,释放相关系统资源和恢复安全问题
drop table #tb01
set @cmdLine = null
set @dosCMD = null
 go  

sp_configure ‘xp_cmdshell‘, 0
go
reconfigure
go

/*
                                    --此处该为自己的数据文件路径,lui注释2015-5-4(右击服务器-属性-数据库设置可看到)
set @partFunName=N‘pf_Time_test‘
set @schemeName=N‘ps_Time_test‘*/
/*
 --上面两次修改分区方案和分区函数名称
--创建文件组
if exists(select * from sys.filegroups where [email protected])
begin
print ‘文件组存在,不需添加‘
end
else
begin
exec(‘ALTER DATABASE ‘[email protected]+‘ ADD FILEGROUP [‘[email protected]+‘]‘)
print ‘新增文件组‘
if exists(select * from sys.partition_schemes where name [email protected])
begin
exec(‘alter partition scheme ‘[email protected]+‘ next used [‘[email protected]+‘]‘)
print ‘修改分区方案‘
end
if exists(select * from sys.partition_range_values where function_id=(select function_id from
sys.partition_functions where name [email protected]) and [email protected])
begin
exec(‘alter partition function ‘[email protected]+‘() split range(‘‘‘[email protected]+‘‘‘)‘)
print ‘修改分区函数‘
end
end
--创建NDF文件
if exists(select * from sys.database_files where [state]=0 and ([email protected] or [email protected]))
begin
print ‘ndf文件存在,不需添加‘
end
else
begin
exec(‘ALTER DATABASE ‘[email protected]+‘ ADD FILE (NAME =‘[email protected]+‘,FILENAME = ‘‘‘[email protected]+‘‘‘)TO FILEGROUP [‘[email protected]+‘]‘)
print ‘新创建ndf文件‘
end
/*--------------------以上创建数据库的文件组和物理文件------------------------*/
--分区函数
if exists(select * from sys.partition_functions where name =@partFunName)
begin
print ‘此处修改需要在修改分区函数之前执行‘
end
else
begin
exec(‘CREATE PARTITION FUNCTION ‘+@partFunName+‘(DateTime)AS RANGE RIGHT FOR VALUES (‘‘‘+@newDay
+‘‘‘)‘)
print ‘新创建分区函数‘
end
--分区方案
if exists(select * from sys.partition_schemes where name =@schemeName)
begin
print ‘此处修改需要在修改分区方案之前执行‘
end
else
begin
exec(‘CREATE PARTITION SCHEME ‘+@schemeName+‘ AS PARTITION ‘+@partFunName+‘ TO
(‘‘PRIMARY‘‘,‘‘‘+@fileGroupName+‘‘‘)‘)
print ‘新创建分区方案‘
end*/
print ‘---------------以下是变量定义值显示---------------------‘
print ‘当前数据库:‘+@tableName
print ‘当前日期:‘+@newDay+‘(用作随机生成的各种名称和分区界限)‘
print ‘合法命名方式:‘+@newNameStr
print ‘文件组名称:‘+@fileGroupName
print ‘ndf物理文件名称:‘+@ndfName
print ‘物理文件完整路径:‘+@fullPath
print ‘文件所在文件夹路径:‘+@path
print ‘分区函数:‘+@partFunName
print ‘分区方案:‘+@schemeName
print ‘年份:‘+@year
print ‘月份:‘+@month
/*
--查看创建的分区函数
select * from sys.partition_functions
--查看分区函数的临界值
select * from sys.partition_range_values
--查询分区方案
select * from sys.partition_schemes
--查询表数据在哪个分区中存储,where条件查询第一个分区中存在的数据
select *,$partition.pf_SaveTime(分区字段) as Patition from 表名 where $partition.pf_SaveTime(分区字段)=1
*/

GO

记下方便日后直接查看。

时间: 2024-10-10 17:47:29

SQL server计划任务分区并按照年月作为文件目录实现分类管理的相关文章

千万级SQL Server数据库表分区的实现

千万级SQL Server数据库表分区的实现 2010-09-10 13:37 佚名 数据库 字号:T | T 一般在千万级的数据压力下,分区是一种比较好的提升性能方法.本文将介绍SQL Server数据库表分区的实现. AD:51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验 最近使用SQL SERVER一个的缓存,数据量一天100w的速度增长,同时接受客户查询,速度由于数据量越来越大越来越慢,这里感谢  KillKill 和 邀约, 最近读了一套书不错,感兴趣的同学可以读读

SQL Server 2008 表分区的含义

继续看这个文档 http://www.360doc.com/content/16/0104/11/22743342_525336297.shtml SQL Server表分区 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理.这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的. 所以

SQL Server 创建表分区

先准备测试表 CREATE TABLE [dbo].[Employee] ( EmployeeNo INT IDENTITY(1,1) PRIMARY KEY, EmployeeName NVARCHAR(50) NULL ); 插入一些数据 INSERT Employee DEFAULT VALUES; GO 10000 UPDATE Employee set EmployeeName = 'Employee ' + CONVERT(VARCHAR, EmployeeNo) 创建文件组 创建文

SQL Server PARTITION FUNCTION(分区)

分区并不影响Linq,sql查询 在MSSQL中,选中目标表,右键-存储-创建分区 根据提示完成分区,存储成sql 这里展示如何根据Id的数据范围分区 在执行前,可能需要设置日志文件大小为"无限制",否则执行过程中可能出现事务日志已满,原因为"LOG_BACKUP"的报错 --其实就是写个生成字符串列表(数据范围)的函数 DECLARE @fenqu nvarchar(max) = N'CREATE PARTITION FUNCTION [fenqu](bigint

SQL Server表水平分区

什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理.这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的. 所以大数据量的数据表,对分区的需要还是必要的,因为它可以提高select效率,还可以对历史数据经行区分存档等.但是数据量少的数据就不要凑这个热闹啦,因为表分区会对数据库产生不必要的

SQL SERVER 表分区

一 .SQL SERVER 表分区介绍: SQL Server  引入的表分区技术,让用户能够把数据分散存放到不同的物理磁盘中,提高这些磁盘的并行处理性能以优化查询性能…… 二 .SQL SERVER 数据库表分区由三个步骤来完成: 1.创建分区函数 2.创建分区架构 3.对表进行分区 基于缓存更新机制,我使用时间来进行分区,这里大家根据业务的要求使用合适的字段来作为分区 创建数据库分区文件数量,这里存储一年的数据分成十二个分区,需要现在D盘建立好Data 的文件夹 里面包含Primary 文件

SQL Server表分区的NULL值问题

SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,往往会被大家吐槽 人家MySQL支持四种类型:RANGE分区.LIST分区.HASH分区.KEY分区 共同点是MySQL跟SQL Server也有分区对齐的问题,都是水平切分,大家都允许分区列存在NULL值 这次我们测试SQL Server表分区的分区列的NULL值,究竟NULL值是被存放在哪个区间,以前一直没有注意 测试脚本 --1.创建文件组 ALTER DATABASE [sss] ADD

SQL Server数据库进阶之表分区实战演练

一.课程介绍 1.1.需求背景 假设,你有一个销售记录表,记录着每个销售情况,那么你就可以把这个销售记录表按时间分成几个小表,例如说5个小表吧.2009年以前的记录使用一个表,2010年的记录使用一个表,2011年的记录使用一个表,2012年的记录使用一个表,2012年以后的记录使用一个表.那么,你想查询哪个年份的记录,就可以去相对应的表里查询,由于每个表中的记录数少了,查询起来时间自然也会减少.但将一个大表分成几个小表的处理方式,会给程序员增加编程上的难度.以添加记录为例,以上5个表是独立的5

SQL server 2014 安装

一.规划并成功的完成SQLSERVER 2014的安装 1.规划系统 安装SQL server 前,第一步应该是合理的规划.以下是规划时的任务和要点: ① 当前工作负载的基准 ② 估计工作负载的增长情况 ③ 最低硬件和软件的需求 ④ 合适的存储系统大小和I/O需求 ⑤ SQLSERVER 版本 ⑥ sql server 排序规则.文件位置.和tempdb大小 ⑦ 服务账户选择 ⑧ 数据库维护和备份计划 ⑨ 最小联机时间和响应时间服务等级 ⑩ 灾难恢复策略 1.1 硬件选择 参考官网:https: