【发布时间】: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 行。
-
你想在这里完成什么?你为什么要花时间清理这张桌子?如果您不知道表的大小(以字节为单位),我假设您不关心节省磁盘空间。