我们的应用程序有许多包含过时数据的表,有些表的历史可以追溯到 2010 年。尽管在这些表上定义了索引,但许多索引会寻求检索旧记录,这既耗时又不必要。因此,我们计划存档或删除旧记录,保留过去五年的数据。从数据库中归档或删除数据的推荐做法是什么?我们是否应该简单地将记录移动到一个新表中进行归档,然后将它们完全删除以进行删除?
我们的应用程序有许多包含过时数据的表,有些表的历史可以追溯到 2010 年。尽管在这些表上定义了索引,但许多索引会寻求检索旧记录,这既耗时又不必要。因此,我们计划存档或删除旧记录,保留过去五年的数据。从数据库中归档或删除数据的推荐做法是什么?我们是否应该简单地将记录移动到一个新表中进行归档,然后将它们完全删除以进行删除?
索引不查找数据,查询查找数据。如果您的查询检查旧数据,则说明它写入错误。
一个简单的例子:
第一个查询将检查所有数据,包括旧数据。即使
shop=123
在 2014 年不存在。第二次查询将立即排除旧记录。当然,您需要year
在索引中包含该字段。但是如果你真的想确保旧数据不被触及,有几种方法可以清理不需要的数据:
只需删除旧数据即可。你当然会完全失去它,但它不会再干扰当前数据。
按视图分离工作数据。只需添加一组具有
select * from tbl where datediff(year, modifydate, getdate())<5
. 确保您在该modifydate
字段上有一个索引。并针对这些视图编写您的实际查询,而不是针对真实的表。优点 - 非常容易设置,缺点 - 可能会造成混淆(从一个对象读取,更新另一个对象)。分区——使用服务器提供的分区机制。优点 - 简单可靠。旧数据仍然可用,但如果请求只需要来自一个分区的数据——它将只转到该分区。
在表中归档 - 部分手动过程:在同一个数据库中创建一个单独的表,将旧数据从工作表移动(复制-删除)到归档表中,定义一个包含工作表和归档表的视图
union
。主要缺点:您必须对当前-旧-组合数据进行三个单独的查询。另一个可能的问题 - 如果您决定使用当前数据更改工作表的结构 - 不要忘记更新存档表和组合视图。当然,您必须设置一个复制-删除程序以定期运行(手动或从某些调度程序)。双服务器解决方案——一台服务器只有当前数据,另一台服务器有所有数据。需要它们之间的 ETL。需要第二个连接才能读取历史记录。客户端应用程序必须足够智能以结合历史和工作数据。但从好的方面来说——工作服务器和存档服务器之间的数据库结构可能非常不同,并且可以根据需要进行规范化或非规范化。这种方法通常扩展为三服务器解决方案:工作数据(当前的、高度规范化的)、历史转储(绝对任何东西)、分析报告数据(高度非规范化的部分数据,可以排除标准报告中不需要的许多字段)。
对我来说没有多大意义。假设您不强制使用查询提示进行索引查找,则查找将基于查询谓词中的值。如果您的查询选择的是 10 多年前的数据,您应该调整您的查询/谓词以不这样做。无需归档数据。-用户 150011
同意,除非您需要昂贵磁盘上的空间,否则这只是调整查询的问题。可能分区可能会有所帮助。-用户 220697
相关:按年归档关系型 OLTP 数据库