10

約 10 万レコードのテーブルがあり、いくつかの行を削除したいのですが、問題は、DELETEステートメントの実行が非常に遅く、30 分以内に終了しなかったことです。しかし、selectステートメントは1秒で返されました。

声明は次のSELECTとおりです。

select * from daily_au_by_service_summary 
    where summary_ts >= to_date('09-04-2012','dd-mm-yyyy') 
    order by summary_ts desc;

そしてDELETE声明は次のとおりです。

delete from daily_au_by_service_summary 
    where summary_ts > to_date('09-04-2012','dd-mm-yyyy');

このテーブルには に唯一のインデックスがありsummary_tsます。

その理由は何ですか?

編集:テーブルをロックするセッションを強制終了した後、問題は解決しました。助けてくれてありがとう。

SESSION_ID ORACLE_USERNAME                OS_USER_NAME                   OBJECT OWNER                   OBJECT_NAME                                                                                                                      OBJECT_TYPE         LOCKED_MODE
---------- ------------------------------ ------------------------------ ------------------------------ -------------------------------------------------------------------------------------------------------------------------------- ------------------- -----------
       213 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       203 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       202 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       190 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       189 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       188 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY                                                                                                      TABLE                         3 
       187 T03RPT                         elou                           T03RPT                         DAILY_AU_BY_SERVICE_SUMMARY         
4

4 に答える 4

9

多くの理由が考えられます:

外部キーが問題である場合、通常の解決策は外部列にインデックスを追加することです。削除するたびに、Oracle はこれが外部キー関係に違反するかどうかを確認する必要があります。

于 2012-04-11T07:26:08.577 に答える
6

削除とは、テーブルの内容を変更することを意味します。つまり、行が削除されるたびに、すべてのインデックスを更新し、すべての外部キー参照をチェックする必要があります。これには非常に長い時間がかかる場合があります。

たぶんこれが役立ちます:

参照、トリガー、および追加のインデックスを使用せずに、そのテーブルのコピーを作成します。次に、これを行います:

insert into new_table (field1, field2, ...) values (
    select field1, field2, ...
    from daily_au_by_service_summary 
    where summary_ts < to_date('09-04-2012','dd-mm-yyyy') 
);

テーブル内のフィールドが同じ順序で定義されている場合、これも機能する可能性があります。

insert into new_table values (
    select *
    from daily_au_by_service_summary 
    where summary_ts < to_date('09-04-2012','dd-mm-yyyy') 
);

その後:

truncate daily_au_by_service_summary

その後:

insert into daily_au_by_service_summary (field1, field2, ...) values (
    select field1, field2, ...
    from new_table; 
);

新しいテーブルはもう必要ありません:

drop new_table;
于 2012-04-11T07:31:10.100 に答える
1

明らかに、削除操作は選択操作よりも時間がかかりますが、表示される違いは考慮されていません。

削除時に追加のコードが実行されているように聞こえます。これは、テーブルにトリガーも実行されている可能性があることを示しています。これを確認できますか?

于 2012-04-11T07:20:21.487 に答える
0

DML 操作に時間がかかる場合は、削除するのではなく、残りの行で新しいテーブルを作成し、前のテーブルを削除します。

つまり、

create table NEW_TABLE as
select * from daily_au_by_service_summary  
where summary_ts <= to_date('09-04-2012','dd-mm-yyyy'); 

これは、特にかなりの数の行を削除する場合に高速になります。(たとえば、全行の %10)。

于 2012-04-11T07:44:18.770 に答える