0

我在 oracle 中有一个审计表,其数据增长非常快,并且已经变得非常大,我决定通过不审计“CALLED_TIME”列来缩短它。

所以我需要从审计表中删除记录,其中审计记录为 CALLED_TIME,稍后我想从表中删除 CALLED_TIME 列(这很容易)以使其不再记录。

如果我能列出要删除的 REV 就更好了

前表中的数据

REV     CALLED_TIME             REVTYPE DATA1   DATA2   DATA3
239402  2014-08-20 20:48:20     0       12122   4       22
239403  2014-08-20 20:52:17     1       12122   4       22
239404  2014-08-20 20:52:58     1       12122   4       22
239405  2014-08-20 20:53:13     1       12122   4       22
239406  2014-08-20 20:53:13     1       12122   4       223
239407  2014-08-20 21:02:05     1       12122   4       223
239408  2014-08-20 21:02:39     1       12122   4       223
239409  2014-08-20 21:04:22     1       12122   4       223
239410  2014-08-20 21:27:53     1       12122   4       223
239411  2014-08-20 21:28:51     1       12122   4       223
239412  2014-08-20 21:29:50     1       12122   4       223
239413  2014-08-20 21:29:50     1       12122   43      223
239414  2014-08-20 21:46:19     1       12122   43      223
239415  2014-08-20 21:46:51     1       12122   43      223
239416  2014-08-20 21:53:08     1       12122   43      223
239417  2014-08-20 22:00:45     1       12122   43      223
239418  2014-08-20 22:01:26     1       12122   43      223
239419  2014-08-20 22:23:01     1       111141  43      223
239420  2014-08-20 22:23:48     1       111141  43      223
239421  2014-08-20 22:32:11     1       111141  43      223
239422  2014-08-20 22:44:42     1       111141  43      223
239423  2014-08-20 22:46:38     1       111141  43      223
239414  2014-08-20 22:55:33     2       111141  43      223

输出应该看起来像

REV     CALLED_TIME             REVTYPE DATA1   DATA2   DATA3
239402  2014-08-20 20:48:20     0       12122   4       22
239406  2014-08-20 20:53:13     1       12122   4       223
239413  2014-08-20 21:29:50     1       12122   43      223
239419  2014-08-20 22:23:01     1       111141  43      223
239414  2014-08-20 22:55:33     2       111141  43      223

我已经看过许多相关的解决方案,但我选择的一个是加入表两次,因此变得非常懒惰。

4

1 回答 1

2

从您的示例数据来看,您似乎想要删除大部分记录。因此,在这种情况下,最好的方法是创建一个包含您想要保留的数据的表,然后只删除您的原始表。

create table temp_audit as 
     select * from (
         select t.*
                , row_number() over (partition by REVTYPE, DATA1, DATA2, DATA3
                                     order by CALLED_TIME asc) rn
          from orig_audit
              )
     when rn = 1;

然后您需要将原始表夷为平地并替换保留的表。最快的方法可能是:

drop table orig_audit;
rename temp_audit to orig_audit;

但是如果你有很多索引、授权、外键来恢复,那可能不会那么快。备择方案?如果您没有引用表的外键,那么这将解决问题......

truncate table  orig_audit;
insert into orig_audit
     select * from temp_audit;

... 除此以外 ...

delete from orig_audit;
insert into orig_audit
     select * from temp_audit;
于 2015-01-09T08:13:04.357 回答