- - PR -
UPDATE文の正当性とパフォーマンスについて
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