我需要对一个巨大的表进行分区,并每天截断该分区

时间:2019-07-31 20:02:30

标签: sql sql-server

我有一个表tblCallDataStore,每天有200万条记录的流量,每天需要删除任何早于48小时的记录。如果我创建一个删除作业,它将运行13个小时以上,有时甚至超过13个小时。什么是对表进行分区并截断分区的可行方法。 我该怎么办?

我有一个Receivedate列,我想根据它进行分区。

1 个答案:

答案 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之前,分区是仅企业级的功能。