关于新增分区过程中遇到的问题(续)
昨天说到新增了分区,我们实现了自动批量新增文件和文件组.大家可以考虑后续做成JOB定期执行,每个月月底执行一下,新增三个月之后的分区,这样一旦有JOB失败能够有缓冲的时间.
今天我们了看看删除分区数据的事情.
昨天我们说存在定期删除过期数据的JOB,所以如果分区太长时间没有新建,将造成不可挽回的错误:删除数据.
那这个定期删除过期数据的是怎么做的呢.
首先,对于分区表来说,每个分区规则制定后,所有符合规则的数据会存放在固定的逻辑文件组中,而这个(这些)文件组会对应于某一个具体的物理文件.
而某个分区方案是可以对应多个分区表的,所以,我们就可以新建一个结构和分区方案与原表一样的新表(归档表).
这样可以通过下面的SQL脚本来将旧表中某个指定分区的数据滑动到新表中,这时候这部分数据就属于新表了,然后执行truncate table清除新表就可以删除这个分区中的全部数据了.
use [DataBase] GO DECLARE @PartitionId INT = DATEDIFF(DAY,'2015-04-01','2015-12-10')+2 select @PartitionId ALTER TABLE OldTable SWITCH PARTITION @PartitionId TO NewTable PARTITION @PartitionId GO --truncate table NewTable
定时JOB中部署上述的作业就可以实现相关自动清理历史数据的效果.
其实我还关心一个事情就是,被清理掉的分区中的数据是没有了,但是文件和分区方案边界还是一直存在,所以在后续会越来越多的产生不在使用的小文件,虽然小但会逐渐影响系统的响应速度.
所以我使用如下方法去定期清理相关文件:
ALTER PARTITION FUNCTION [parfunDay]() MERGE RANGE ('2015-04-01')
使用昨天的循环脚本,执行到指定的归档日期即可.
然后执行下面的脚本删除对应的文件和文件组
ALTER DATABASE [Database] REMOVE FILE [PartitionDB_FG-2015-04-01] ALTER DATABASE [Database] REMOVE FILEGROUP [PartitionDB_FG-2015-04-01]
PS:所有有办法用JOB实现的自动新增和自动删除的工作都是有规律可循的.比如这两篇的文件名或者文件组名或者分区方案及分区函数均以日期为区分.所以在新增和清理时都可以根据日期来处理.