ただいまOracleの勉強中でふと気になったので、暇なときにでもお答えくださいませんか。

 A と B と二つのテーブルがあって、一方の値で他方を一括更新かけるのに、以下のような SQL を発行したとします。

UPDATE TABLE_A A
SET ( A.COL_1 ) =
(SELECT B.COL_2 FROM TABLE_B B, A WHERE B.COL_KEY = A.COL_KEY)

 この場合、A のデータがもし100万件あれば100万回、サブクエリーを実行して UPDATEをかけるといった処理が走ると思いますが、このとき、ロールバックセグメントも100万件分の大きさが必要になるのでしょうか?

 そして、もしロールバックセグメントが不足した場合は、全体がロールバックされて何もなかったことになるのでしょうか?

A 回答 (1件)

更新の条件がすべて当てはまるのであれば、100万件のロールバックセグメントが必要になります。

(実際は、もう少しいる)

まずひとつ、このSQL文を実行しても必ずしも100万回のサブクエリが走るとはいえません。Oracleのオプティマイザがもう少しいいパスを見つけるでしょう。

それから、先ほども書いたように、条件があわなければ、Updateをかけませんので必ずしも100万件の更新をするわけではありません。

ロールバックセグメントの容量が足りなくなれば、すべてロールバックされますので、何もなかったことになります。(件数によりますが、ものすごく時間はかかると思います)
    • good
    • 0
この回答へのお礼

明快なお答え,ありがとうございます。
オプティマイザがもう少しいいパスを見つけるというのはなるほどと思いました。

ロールバックセグメントの件は了解です。実際、やってみたところロールバックされてしまいました(^^;;

お礼日時:2001/12/16 04:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す


人気Q&Aランキング

おすすめ情報