1

現時点では、次のステートメントを使用しています。

delete
from tbl_name
where trunc(tbl_name.Timestamp) = to_date('06.09.2013','DD/MM/YYYY');

しかし、これには非常に時間がかかります。物事をスピードアップする方法はありますか?

ありがとうございました

4

4 に答える 4

3

まず、これは確かに大きなテーブルです。そうでなければ、あなたのような非常に長い時間がかかるステートメントには意味がありません。

次に、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) に基づいて、選択、更新、および削除で目的のレコードを検索できます。

于 2013-09-25T10:42:55.440 に答える
1

左側で 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');
于 2013-09-25T09:56:57.790 に答える
0

あなたが列を参照しているのでtbl_name.Timestamp、それに関連付けられた主キーもあるに違いないと私は考えています。主キーが数値の場合、delete ステートメントでそのインデックスを次のように使用できます。

tbl_name から削除します。ここで、tbl_name.IDはLOWER_ID_VALUEUPPER_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 つのステップで実行する方が適切です。

于 2013-09-25T09:28:51.143 に答える