現時点では、次のステートメントを使用しています。
delete
from tbl_name
where trunc(tbl_name.Timestamp) = to_date('06.09.2013','DD/MM/YYYY');
しかし、これには非常に時間がかかります。物事をスピードアップする方法はありますか?
ありがとうございました
まず、これは確かに大きなテーブルです。そうでなければ、あなたのような非常に長い時間がかかるステートメントには意味がありません。
次に、2 つの可能性があります。
1) delete ステートメントは、非常に多くのレコードに影響を与えます。
その場合、ステートメントが長くかかるのは当然のことです。テーブル全体をスキャンする必要があります (テーブル全体のスキャン)。ステートメントを並列化することによってのみ、これを高速化できます。
delete /*+parallel(tbl_name,4)*/ from tbl_name ...
2) 削除ステートメントは、テーブル内のレコードのごく一部に影響を与えます。
その場合、Oracle でインデックスを使用することをお勧めします。タイムスタンプ列の日付部分のみを要求しているため、関数インデックスを作成します。
create index index_name on tbl_name( trunc(the_timestamp) );
テーブルで使用可能なインデックスがあれば、Oracle はそれを使用して、trunc(the_timestamp) に基づいて、選択、更新、および削除で目的のレコードを検索できます。
左側で trunc を使用する代わりに、右側で between 値を使用します。
delete from tbl_name
where tbl_name.Timestamp between to_date('06.09.2013 00:00:00','DD/MM/YYYY hh24:mi:ss')
and to_date('06.09.2013 23:59:59','DD/MM/YYYY hh24:mi:ss');
あなたが列を参照しているのでtbl_name.Timestamp
、それに関連付けられた主キーもあるに違いないと私は考えています。主キーが数値の場合、delete ステートメントでそのインデックスを次のように使用できます。
tbl_name から削除します。ここで、tbl_name.IDはLOWER_ID_VALUEとUPPER_ID_VALUEの間です
注: LOWER_ID_VALUE と UPPER_ID_VALUE は本質的に包括的です。つまり、これら 2 つの ID のレコードも削除されます。
rownum を使用して削除を分割するという ppeterka 66 のアイデアは実行可能ではありません。http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2345591157689をご覧ください。
Oracle を実行していると仮定すると、DELETE コマンドが発行されると、削除された行がロールバック セグメントに格納されるため、必要に応じて変更を元に戻すことができます。そのため、現在テーブルに存在しないロールバックの行のイメージがあります。これで、すべてのロールバック ブロックも REDO ログ ファイルに書き込まれます。そのため、テーブルを含むデータ ブロック (もちろん削除された行はありません) と古いイメージを含むロールバック ブロックはどちらも REDO を生成し、追加のアーカイブ ログの原因となります。
したがって、複数のトランザクションに分割して実行するよりも、1 つのステップで実行する方が適切です。