0
UPDATE t1
   SET t1.language_id = (SELECT distinct(CASE WHEN NETWORK.nid = 11 
                                  THEN 10
                                  ELSE 7
                              END)
                       FROM PROFILE,
                            NETWORK
                      WHERE PROFILE.STATUS IN ('A','U','S','H','I')
                        AND PROFILE.mid = t1.mid
                        AND NETWORK.mid = t1.mid
                        AND t1.is_deleted = 'N')

   AND EXISTS( SELECT 1

              FROM PROFILE,
                   NETWORK
             WHERE PROFILE.STATUS IN ('A','U','S','H','I')
               AND PROFILE.mid = t1.mid
               AND NETWORK.mid = t1.mid
               AND t1.is_deleted = 'N');

ゆっくりする方法です。use ステートメントに異なる更新を使用しますか? 10 に対して 1 回、7 に対して 1 回の更新を行います。

4

2 に答える 2

1

t1テーブルデータベースのすべてのレコードに対するクエリではNETWORK、 とPROFILEテーブルに対して個別のクエリが実行されます。実際には、このテーブルを一度だけスキャンする必要があります。

MERGE 句を使用することをお勧めします。

merge into t1
using (
  select
    network.mid,
    decode(network.nid, 11, 10, 7) language_id,
  from
    profile,
    network
  where
    profile.status in ('A','U','S','H','I')
    and
    network.mid = profile.mid
) update_set 
on
  t1.mid = update_set.mid 
  and
  t1.is_deleted = 'N'
when matched
  then update set t1.language_id = update_set.language_id
;

詳細については、Oracle ドキュメントの説明を参照してください。

于 2013-03-19T21:34:18.757 に答える
0

MID列のインデックスと統計を確認します(私は高い選択性を想定しています)。実行計画を確認してください。PQ/PDMLを確認してください。MIDがすべての面でUNIQUE列である場合は、次のように変更できます。

UPDATE t1
SET t1.language_id = (SELECT distinct(CASE WHEN NETWORK.nid = 11 
                              THEN 10
                              ELSE 7
                          END)
                   FROM NETWORK
                   where NETWORK.mid = t1.mid
                   )
WHERE EXIST ( SELECT 1 from NETWORK where NETWORK.mid = t1.mid )
AND EXISTS( SELECT 1 FROM PROFILE where PROFILE.STATUS IN ('A','U','S','H','I')
                    AND PROFILE.mid = t1.mid )
AND t1.is_deleted = 'N'
于 2013-03-19T21:03:55.377 に答える