いつもお世話になっております。
この度は、手前のSQL文において
DELETE文のレスポンスが上がらずに難儀しています。
現在DELETE処理はバッチにて行っています。
最初にSELECTにて抽出を行ったものをバックアップにとり、
次は同様の条件でDELETE文で処理しています。
この際に、SELECTでは1秒程度で済んだ処理が、
DELETE文ではレスポンスが返ってこないという状況です。
何がまずいのか、どう工夫すればいいのか
色々変えてみましたがレスポンスは改善されません。
SQLと条件は以下です。
【SQL文】
SELECT 複数の項目
FROM TABLEA A
WHERE NOT Exists(SELECT 'X' FROM TABLEB B WHERE A.ITEMNO = B.ITEMNO)
AND NOT Exists(SELECT 'X' FROM TABLEC C WHERE A.ITEMNO = C.ITEMNO
AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < C.REPYMD)
AND NOT Exists (SELECT 'X' FROM TABLEA2 A2 WHERE A.ITEMNO = A2.ITEMNO
AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < to_char(A2.CREATEDATE,'YYYYMMDD'))
AND NOT Exists(SELECT 'X' FROM TABLEC C WHERE A.ITEMNO != C.ITEMNO
AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < to_char(A.CREATEDATE,'YYYYMMDD'))
上記のSELECT文の後に処理されるDELETE文は
「SELECT 複数の項目 FROM TABLEA A」 ⇒ DELETE FROM TABLEA A としたもので、
条件は全てSELECT文と同様のものを使用しています。
◆条件を言葉で明記すると以下のようになります。
1.Bテーブルに存在するものは削除対象外とする
2.AテーブルのアイテムIDとCテーブルのアイテムIDは一致する。
AテーブルのCREATEDATEとCテーブルのREPYMDのいずれかが3ヶ月以内のアイテムは
削除対象外とする
3.AテーブルもしくはCテーブルにしか存在しない場合は、各日付が3ヶ月以内のアイテムは
削除対象外とする
以上のようになっています。
どなたかアドバイスをいただければ幸いです。
宜しくお願い致します。
お礼
ご回答いただきまして、ありがとうございます。 自己解決ができました。 Exists中の'X'をROWIDで抽出するように変更したところ、 レスポンスが返ってくるようになりました。 速度も上々です。 主キーはアイテムNOや年月日でしたが、 インデックスは覚えていませんが、 その実行計画は異なっていたのかもしれませんね。 SELECT文とDELETE文は条件をあわせないといけないという 制約がありましたので条件を変更できずの苦労でした。 お手数おかけしました。