テーブルを検討してください:
Table Name:ORDER
Columns: (ID (PK), ORDER_NUM, ORDER_STATUS, etc...)
Index(ORDER_IDX) exists on (ORDER_NUM, ORDER_STATUS) together.
There are various FKs too, on which Indexes exist as well.
There are about 2 million rows in the table.
SQL クエリを検討してください。
DELETE from ORDER where ORDER_NUM=234234;
特定の ORDER_NUM 値の場合、DELETE クエリの初回の実行は非常に遅くなります (200 行を削除するのに約 5 秒かかります)。
しかし、ロールバックして同じORDER_NUM に対して DELETE Query を再度実行すると、DELETE QUERY は 200 ミリ秒で実行されるようになりました。
したがって、このクエリに新しいORDER_NUM を指定すると、クエリの実行速度が非常に遅くなります。
初めてクエリ自体を固定するにはどうすればよいですか? インデックスを再構築する必要がありますか? それとも何か?
これをOracle SQLクライアントツール(TOAD/SQL-Developerなど)からテストしています-実際に使用されているWebアプリケーション内でこの遅い動作を見た後。
EDIT>>>
SET AUTOTRACE ON の結果
QUERY が実行される最初の時間
3 user calls
0 physical read total multi block requests
4915200 physical read total bytes
4915200 cell physical IO interconnect bytes
0 commit cleanout failures: block lost
0 IMU commits
1 IMU Flushes
0 IMU contention
0 IMU bind flushes
0 IMU mbu flush
クエリ実行時の 2 回目
3 user calls
0 physical read total multi block requests
0 physical read total bytes
0 cell physical IO interconnect bytes
0 commit cleanout failures: block lost
0 IMU commits
1 IMU Flushes
0 IMU contention
0 IMU bind flushes
0 IMU mbu flush
EXPLAIN プラン- FIRST RUN と SECOND RUN の両方でまったく同じです - 以下に示します。
ID OPERATION NAME ROWS Bytes Cost(%CPU) Time<br>
=======================================================================================
0 DELETE Statement 49 2891 41 (0) 00:00:01
1 DELETE ORDER
2 INDEX RANGE SCAN ORDER_IDX 49 2891 3 (0) 00:00:01
初めてのときに、非常に高い物理読み取りが表示されます。
この状況を改善するために何かできることはありますか?