0

選択クエリのカーソルに基づいてテーブルを更新するには、2 つのオプションがあります。

次の選択クエリがあるとします。

select id1 from table1

私の更新クエリは次のとおりです。

update table2 set value=1 where table2.id2 = table1.id1

現在、2 つのオプションは次のとおりです。

  1. 選択クエリにカーソルを設定し、一括でフェッチしてから、for all ステートメント内で更新クエリを起動します。

  2. 選択サブクエリを使用して更新クエリを次のように記述します。

    update table2 set value=1 where table2.id2 in (table1 から id1 を選択)

どちらの方がよいですか?

Oracle は select サブクエリを一括収集に内部的に変換しますか、それとも通常のカーソルとして扱いますか?

4

1 に答える 1

1

最初の質問「Oracleは内部でselectサブクエリを一括収集に変換しますか?」
いいえ。オプティマイザーはプランを計算し、適切な方法でサブクエリからデータを選択します。一括収集は必要ありません。

あなたの質問に「どちらが良いですか?」。まあ、それは異なります。table1.id11回の実行ですべてを取得するクエリを作成でき table2に多数の行があるため、副選択にコストがかかる場合は、おそらく一括収集を使用します。ただし、データの量によっては、これを実現するためにPGAが必要になることに注意してください。

しかし、私は別の-私見は非常にエレガントな-解決策を指摘するかもしれません:

MERGE INTO table2
  USING (select id1 from table1)
   ON (id2 = id2)
  WHEN MATCHED THEN 
   UPDATE SET value=1
;

これは通常、サブクエリを実行するよりも高速で、一括収集よりも高速です。1つはtable1で実行し、もう1つはtable2で実行します。(where必要に応じて句を追加してください)

于 2012-08-31T11:16:26.027 に答える