2012-01-16 5 views
0

年齢に基づいて表から行を削除するスクリプトをoracleに書き込む可能性はありますか?つまり、行sを削除したいとします。何百万行ものテーブルがあり、最新の3か月の行だけを残したいと思っています。私は年齢または日付に基づいてOracle表から何百万もの行を削除するスクリプト

のような列の名前を持つ次の表を持っています

私は非常にデータベースのものに新しいです。このためのスクリプトを書くにはどうすればいいですか? FEED_DT_TM以来

+1

あなた自身で試してみましょう。ただし、where句をテストするための 'select'クエリとして実行してください。データが正しいかどうか確認したら、バックアップを行い、実際の「削除」クエリに切り替えます。 –

+0

ORA_ROWSCN、Oracle9iでサポートされているかわかりません –

+0

@Raghavendar - 'FEED_DT_TM'のデータ型は? 'DATE'の場合は、' TO_DATE'を呼びたくないでしょう。 'VARCHAR2'の場合は、ほとんどの場合、文字列の書式に一致する書式マスクを使用したいと思うでしょう。データモデルの観点からは、それは 'DATE 'でなければなりません。 –

答えて

1

DATEで、DATEにキャストするTO_DATEを使用する必要はありません。単純に

DELETE FROM your_table_name 
WHERE sysdate - feed_dt_tm >= 120 
+0

ありがとうございました。私はまだテーブルから約1,200万行を削除する単一の削除ステートメントに行くかどうか混乱しています。スクリプトを作成して実行するなど、同じ操作を別々に実行する方法はありますか?上記の削除操作を実行するのに時間がかかることが懸念されます。 – Raghavendar

+0

@Raghavendar - 他にも多数の行を削除する方法があります。ただし、これらの方法は時間がかかり、リソースが多く消費され、書き込みやテストが難しくなります。単一の 'DELETE'ステートメントは、大量の行を削除する最も効率的な方法です。 –

+0

ありがとうございます。今私の懸念が解消されました。私は上記の作業を私のDBAと話し合って実行します。実際に、私のDBAは私に、彼に知らせるために、私はdelete文の代わりにスクリプトを書くように頼んだ – Raghavendar

2

このように多くの行を1つのトランザクションで削除すると、多くの元に戻す領域が使用されることも予測する必要があります。削除するすべての行は、トランザクションをロールバックできるように一時的にUNDO表領域に保存されます。さらに重要なことは、削除をコミットするまで他のユーザーに行を表示させることです。アドバイスについてはthis asktom threadを参照してください。

1

また、必要な行を新しい表に保持してから古い表を削除するオプションも検討してください。

のような何か...

create table new_table_2_months 
as 
select * 
    from table1 
    where date_column > (sysdate-60) 

drop table table1; 

alter table new_table_2_months rename to table1; 

はあなたにも該当する場合、最初のテーブルに、制約、索引およびその他のオブジェクトを見ていることを確認します。そして、テスト、テスト、テストを忘れないでください。

関連する問題