【问题标题】:Find out the recently selected rows from a Oracle table and can I update a LAST_ACCESSED column whenever the table is accessed从 Oracle 表中找出最近选择的行,我可以在访问表时更新 LAST_ACCESSED 列吗
【发布时间】:2018-04-26 22:49:33
【问题描述】:

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

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

oracle DB 是否有任何内置元数据可以为我提供此信息。

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

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

【问题讨论】:

  • 表的段大小有多大? (即select sum(bytes)/1024/1024/1024/1024 tb from dba_segments where segment_name = 'TABLE_NAME';。)我有一种感觉,只有 100% 准确的解决方案在编写和维护时会很痛苦。除非数据巨大,否则可能不值得这样做。
  • 我无法执行上述操作。我没有实际表的权限。我有实际表的副本或子集。但是该表有大量条目。估计每年的条目数为 89560923 行。
  • 你想在这里完成什么?你为什么要花时间清理这张桌子?如果您不知道表的大小(以字节为单位),我假设您不关心节省磁盘空间。

标签: database oracle


【解决方案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 语句。

【讨论】:

  • 这里的问题是,数据是大约 5 年前创建的,新数据创建的很少。即使在今天,仍然可以访问或使用 5 年前创建的行。所以创建分区不是解决方案。我将检查堆映射选项。感谢回复
  • 这里没有问题,即使里面已经有数据,你也可以对表进行分区。数据库足够智能,可以将现有数据移动到正确的分区中,并以一致的在线方式进行。查看文档中的Converting a Non-Partitioned Table to a Partitioned Table。因此,您今天仍然可以按照适合您今天的信息生命周期管理策略的方式对 5 年前的数据进行分区。
  • 我不想根据创建日期拆分数据,而是应该根据访问日期或选择日期或上次使用日期进行清理。您的解决方案没有提供一种方法来查找最后一次“选择”行的时间。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-07-22
    • 1970-01-01
    • 2018-06-12
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多