0

オラクルに監査テーブルがあり、そのデータは非常に急速に成長しており、すでに非常に大きくなっています。「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

私はすでに多くの関連ソリューションを見てきましたが、私が選んだのはテーブルに2回参加しているため、非常に怠惰になっています。

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 に答える