我有一个表tblCallDataStore,每天有200万条记录的流量,每天需要删除任何早于48小时的记录。如果我创建一个删除作业,它将运行13个小时以上,有时甚至超过13个小时。什么是对表进行分区并截断分区的可行方法。 我该怎么办?
我有一个Receivedate列,我想根据它进行分区。
答案 0 :(得分:1)
不幸的是,您需要咬一下一次性的项目符号和add partitioning to your table(提示:以您要输入的时间戳记的DATEPART(DAY, ...)
为基础,这样您就可以快速获得{ {1}}变量)。之后,您可以使用SWITCH PARTITION
语句将指定分区ID的所有行移动到另一个表。然后您可以快速@ParitionID
接收表,因为您不再关心数据了。
此过程中有几个棘手的设置步骤:管理分区ID本身,并确保接收表具有identical structure(以及其他各种要求,例如无法引用分区表)与外键(嗯... ouch))。获得所需的分区ID后,代码很简单:
TRUNCATE
我一直想写一个存储过程来自动维护接收表,因为在工作中,只要进行更改(例如添加新的列或索引),我们就一直串联手动更新两个表。要手动执行此操作,基本上只需复制表定义,然后在所有实体名称后添加一些内容(例如,将数字2放在最后)。
P.S。也许您想改用每小时分区,那么您可以更好地控制“ 48小时”的要求,并且还可以灵活地处理时区(ugh)。由于ALTER TABLE [x] SWITCH PARTITION @PartitionID TO [x_copy]
显然不能直接工作,您只需要变得更加聪明即可。还要注意,您的分区ID必须定义为一个范围,因此最终您最终将在它们之间循环,因此请记住这一点。
P.P.S。正如David Browne的评论所指出的那样,在SQL 2016 SP1之前,分区是仅企业级的功能。