假设我有一个包含相关信息的表格。但是,数据仅与30分钟相关,即30分钟。
之后它只是数据库垃圾,所以我需要尽快摆脱它。
如果我愿意,我可以定期清理此表,单独为每条记录设置过期日期时间,并通过作业或其他内容删除过期记录。这是我的第一选择,除非有人说服我,否则将会做什么。
但我认为这个解决方案可能会有问题。如果有人停止运行而没有人注意到该怎么办?我正在寻找类似于将临时数据插入表格的内置方法。或者是一个包含" volatile"的表格。数据本身,在插入后的x个时间后自动删除数据。
最后但并非最不重要的是,如果没有内置方法可以做到这一点,我能否在SQL Server 2008(或2012年,我们将很快迁移)中实现此功能?如果是这样,有人可以给我指示如何实现类似的东西吗?
(对不起格式化结果不好,第一次使用智能手机在SO上发布)
答案 0 :(得分:2)
正如另一个答案所示,TRUNCATE TABLE是一种快速删除表格内容的方法,但它具有攻击性;它会彻底清空桌子。此外,它的使用受到限制;除此之外,它不能用在" are referenced by a FOREIGN KEY constraint"。
的表格上。任何更有针对性的行删除都需要带有WHERE子句的DELETE语句。在相关标准字段(例如插入日期)上建立索引将提高删除的性能,并且可能是一个好主意(取决于它对INSERT和UPDATE语句的影响)。
你需要一些东西来触发" DELETE语句(或TRUNCATE语句)。正如您所建议的那样,SQL Server代理作业是一个明显的选择,但您担心该作业被禁用或删除。任何解决方案都容易受到删除工作的影响,但触发活动的方式比工作更为模糊。您可以将删除嵌入到插入过程中 - 无论是在您拥有的任何存储过程或应用程序代码中,还是作为实际的表触发器。这两种方法都增加了INSERT所需的时间,并且由于它们不是由SQL Server代理带外处理的,因此需要用户稍等一些。如果您拥有正确的索引并且表格的大小合理,那么这可能是一种可接受的权衡。
我不知道SQL Server只是开始删除数据的任何其他功能。没有自动数据保留策略实施。
答案 1 :(得分:0)
请参阅@Yuriy评论,这是相关的。
如果你真的需要实现它的DB方....
截断表是摆脱记录的快捷方式。 如果你需要的只是 ONE 表,而你只需要用数据填充它,请使用它并尽快处理它,你可以考虑截断(永久)“CACHE_TEMP”表。
运行并发线程/作业并且每个都在处理它自己的数据时,场景会变得更加复杂。
如果该数据仅存在于单个“作业”/上下文中,则可以考虑使用#TEMP表。它们有点不稳定,可能就是你想要的。
你也许可以使用表变量,它们比临时表更易变,但它取决于你没有发布的东西,所以我不能说什么真的更好。