我们正在我们的系统中实施一项新功能,这将导致smallint
每晚从表中清除大约一百万条记录(每条记录都很小,基本上是一个 GUID、一个日期和四个字段)。基本上它是一个缓存表,一旦数据存在 7 天,我们就会这样做:
DELETE FROM scheduleCache WHERE schDateCreated < '2013-08-26
这将在每晚凌晨 1 点运行,并且每次运行时都会清除大约一百万条记录。
对于这样的桌子,有什么我应该注意或做的吗?我应该放在桌子上的任何属性,或者我应该定期运行以“清理”的任何例程?我以前从未处理过这样的桌子。
该表有一个单一的聚集索引(GUID + 一个smallint
字段),我们有一个每周日早上运行的每周索引重建。
删除表的大部分内容绝非小事。到目前为止,最好的方法是分区。带有滑动窗口的日常分区方案确实是解决此问题的灵丹妙药,请参阅如何在分区表中实现自动滑动窗口。
如果您负担不起分区(例如现场的非企业许可证),那么我建议按
schDateCreated
. 如果您需要 GUID+smallint 上的主键,则将其移至非集群。批量删除(如TOP 10000
),循环删除,减少日志压力。考虑在手术后更新统计信息。一种解决方案是每天将数据存储在一个表中,当表从缓存中老化时将其删除。这些表的名称将类似于 cache_(julian date)。
另一种解决方案是拥有一组表 cache_0 到 cache_n,在使用前截断每个表。您将每天使用表 cache_((julian date) modulo (cycle period))。
您需要小心处理年终,因为无论哪种解决方案,您都将从 365 或 366 变为 0。