从Oracle表中找出最近选择的行,并且可以在访问表时更新LAST_ACCESSED列

时间:2017-11-14 05:16:34

标签: database oracle

我有一个数据库表,其中有超过100万条由GUID列唯一标识的记录。我想知道在过去5年中选择或检索了哪些记录或行。选择查询可以在多个地方发生。有时行将作为单行返回。有时它会成为一组行的一部分。有一个select查询从java代码中获取jdbc连接。 SQL过程也从表中获取数据。

我的目的是清理数据库表。我想删除过去5年中从未使用过的所有行(通过select查询检索)。

oracle DB是否有任何可以提供此信息的内部元数据。

我的另一种解决方案是添加一列LAST_ACCESSED并在每次从此表中选择一行时更新此列。但根据整个过程所花费的时间,这项操作对我来说是一项昂贵的操作。 Atleast 1000 - 将从表中选择10000条记录进行单次操作。有没有有效的方法来做到这一点,而不是在阅读后更新表。我的是一个多线程应用程序。所以更新这样大的数据集可能会导致下一次读取查询的死锁或大等待时间。

这个问题有什么优雅的解决方案吗?

2 个答案:

答案 0 :(得分:1)

Oracle Database 12c引入了一项名为Automatic Data Optimization的新功能,它使Heat Maps能够跟踪表访问(修改和读取操作)。小心,该功能是currently to be licensed under the Advanced Compression Option or In-Memory Option

每当修改数据库块或访问某个段(即表或表分区)时,

热图就会跟踪。它不跟踪每个单独行的选择操作,也不跟踪单个块级别的选择操作,因为开销太大(通常经常并且同时读取数据,必须为每一行保持计数器将很快变成非常昂贵的操作)。但是,如果您按日期对数据进行了分区,例如每天创建一个新分区,您可以随着时间的推移轻松确定哪些天仍在读取以及哪些日期可以归档或清除。分区也是需要获得许可的选项。

一旦得出该结论,您就可以使用In-Database Archiving将行标记为已存档,或者只是继续并清除行。如果您碰巧对数据进行了分区,则可以执行简单的DROP PARTITION操作来清除一个或多个分区,而不必执行传统的DELETE语句。

答案 1 :(得分:0)

我无法使用任何内置解决方案。我试过以下解决方案 1)select语句的DB审计功能。 2)每当在表上执行选择查询时,添加触发器以更新日期列。

两人都被丢弃了。审计占用了大量空间并且性能受到影响。类似的触发器也有性能受损。

最后,我通过维护一个单独的表来解决问题,这些表是插入了仍在查询中使用或选择的5年以上的条目。删除时,我会交叉检查此表,并避免删除此表中的条目。