- PR -

UPDATE文の正当性とパフォーマンスについて

1
投稿者投稿内容
hoofer
会議室デビュー日: 2005/02/02
投稿数: 1
投稿日時: 2005-02-02 21:17
はじめまして、質問させてください。

DBはOracleです。

MASTERテーブルのNAMEはユニーク
WEB_MESSAGEテーブルのNAMEは同一NAMAEが存在する

★やりたいこと
MASTERテーブルのTOROKU_DATEがNULLかつ、
WEB_MESSAGEテーブルのA_FLGが'1'、かつDEL_FLGが'1'でない
WEB_MESSAGEのデータのA_FLGを'2'に更新する

以下のようなSQLを組んだところ↓
(おかしなSQLですみません)

UPDATE WEB_MESSAGE WEB
SET WEB.A_FLG='2'
WHERE
WEB.A_FLG='1' AND
WEB.DEL_FLG!='1' AND
WEB.NAME IN (
SELECT KY.NAME FROM MASTER MST
WHERE
MST.NAME=WEB.NAME AND
MST.TOROKU_DATE IS NOT NULL)
/

データの状態(実行前)
MASTER
NAME TOROKU_DATE
-----------------------------
     :    :
PENCIL NULL
     :    :

WEB_MESSAGE
SEQ_NO NAME A_FLG DEL_FLG
-----------------------------------------
: : : :

3 BAG 0 0
1 PENCIL 1 0
2 PENCIL 1 0
3 PENCIL 1 1
4 PENCIL 1 0

: : : :

望んでいた結果
WEB_MESSAGE
SEQ_NO NAME A_FLG DEL_FLG
-----------------------------------------
: : : :

3 BAG 0 0
1 PENCIL 2 0
2 PENCIL 2 0
3 PENCIL 1 1
4 PENCIL 2 0

: : : :

実際の結果
WEB_MESSAGE
SEQ_NO NAME A_FLG DEL_FLG
-----------------------------------------
: : : :

3 BAG 0 0
1 PENCIL 2 0
2 PENCIL 2 0
3 PENCIL 1 1
4 PENCIL 1 0

: : : :

データによって?は上記のパターンの場合、
(対象外のデータの次に対象データが存在するパターン?)
SEQ_NOが'4'であるデータのA_FLGが'2'にUPDATEされないときがある

質問1
上記SQLでおかしな使い方をしているのは、なんとなくわかるのですが、
どういう現象がおきて正しくUPDATEされるときと、されないときが
あるのでしょうか?

また、上記SQL文を以下のように変更した場合、
UPDATE WEB_MESSAGE WEB
SET WEB.A_FLG='2'
WHERE
WEB.A_FLG='1' AND
WEB.DEL_FLG!='1' AND
WEB.NAME IN (
SELECT KY.NAME FROM MASTER MST, WEB_MESSAGE W
WHERE
MST.NAME=W.NAME AND
MST.TOROKU_DATE IS NOT NULL)
/
(一応、正しくUPDATEされるようになりましたが)
質問2
MASTERテーブルのデータ件数が何万件単位になるとかなりパフォーマンス
が悪いSQLになっていると思われますが、もっと賢いやり方があれば
ぜひご教授ください。
(やはりカーソル・フェッチして1データずつUPDATEしないと駄目でしょうか?)
1

スキルアップ/キャリアアップ(JOB@IT)