3

私はいくつかのデータベース アップグレード スクリプトを書いています。

DELETE FROM TPM_TASK WHERE TASK_TYPE='System';

このクエリには 1 時間以上かかります。犯人が何か気になります。

実行計画は次のとおりです。

DELETE STATEMENT    899.0   887 57793984    35481   1454721 899                             ALL_ROWS                                            
DELETE                                                      1   TPMDBO  TPM_TASK                                                        
TABLE ACCESS (FULL) 899.0   887 57793984    35481   1454721 1   TPMDBO  TPM_TASK    FULL    TABLE   ANALYZED    1   

ランニング:

select count(1) FROM TPM_TASK WHERE TASK_TYPE='System';

計画は次のとおりです。

SELECT STATEMENT    92.0    89  14527479    1   7   92                  ALL_ROWS                                            
SORT (AGGREGATE)                1   7   1           AGGREGATE                                                   
INDEX (FAST FULL SCAN)  92.0    89  14527479    35481   248367  1   TPMDBO  TPM_TASK_TASK_TYPE  FAST FULL SCAN  INDEX   ANALYZED

このクエリは非常に高速で、44,202 行が得られます。テーブル内の行の総数は 71419 です。半分以上の行を削除しているので、Oracle は削除時にインデックスをまったく使用しないと考えていますが、これは問題ありません。いずれにしても、71,000 行のフル スキャンには数秒しかかかりません。

このテーブルにはトリガーがありません。このテーブルに FK 制約を持つテーブルは他にありませんが、このテーブルを使用するいくつかのビューと SQL 関数があります。このデータベースを使用する唯一のアプリケーションは、アップグレード中にシャットダウンされる Web サーバーです。そのため、ロックの問題は発生していないと思います。他のアイデアはありますか?

4

1 に答える 1