私はいくつかのデータベース アップグレード スクリプトを書いています。
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 サーバーです。そのため、ロックの問題は発生していないと思います。他のアイデアはありますか?