みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Oracle SQL DELETE文のレスポンス

いつもお世話になっております。

この度は、手前の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ヶ月以内のアイテムは
  削除対象外とする

以上のようになっています。

どなたかアドバイスをいただければ幸いです。
宜しくお願い致します。

投稿日時 - 2012-01-31 00:27:46

QNo.7276483

すぐに回答ほしいです

質問者が選んだベストアンサー

各テーブルの件数、主キー、索引の有無、SELECT文の実行計画がわからないのでなんとも言えませんが、何らかの理由でSELECTとDELETEで異なる実行計画が採用されている可能性があります。

もし、tableaに主キーがあるなら、そのデータを抽出し、IN句を使ってDELETEを実行してみてください。

投稿日時 - 2012-01-31 19:01:29

お礼

ご回答いただきまして、ありがとうございます。
自己解決ができました。

Exists中の'X'をROWIDで抽出するように変更したところ、
レスポンスが返ってくるようになりました。
速度も上々です。

主キーはアイテムNOや年月日でしたが、
インデックスは覚えていませんが、
その実行計画は異なっていたのかもしれませんね。

SELECT文とDELETE文は条件をあわせないといけないという
制約がありましたので条件を変更できずの苦労でした。

お手数おかけしました。

投稿日時 - 2012-01-31 22:54:49

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問