2

サブクエリと update および delete 句の実行に関する Oracle の動作はどうなっているのだろうか。

私はオラクルのだろうか:

  1. サブクエリを実行し、行ごとに更新句と削除句を実行します
  2. 更新用のサブクエリを実行してから、削除用のサブクエリを実行します
  3. 1) および 2) では、オプティマイザーが最適な戦略を選択します。
  4. 他の?

編集:

DB 使用: Oracle 11.2.0.3.0 私はこのきれいなクエリを持っています

DROP TABLE T1;
DROP TABLE IT1;
テーブル OT1 をドロップします。

テーブル T1 の作成 (
  ID整数、
   V整数、
   ピボット整数
);

テーブル IT1 の作成 (
  ID 整数
);

テーブル OT1 の作成 (
  ID整数、
  FOO 整数、
   NV 整数
);

T1 (ID、V、PIVOT) 値 (1,1,1) に挿入します。
T1 (ID、V、PIVOT) 値 (2,1,1) に挿入します。

IT1 (ID) 値 (1) に挿入します。
IT1 (ID) 値 (2) に挿入します。

OT1 (ID,NV,FOO) 値 (1,2,0) に挿入します。
OT1 (ID,NV,FOO) 値 (2,2,0) に挿入します。

専念;


( を使用して T1 ターゲットにマージ
  個別の T1.ID、T1.V、OT1.NV を選択
  T1から
  内部結合 IT1 オン T1.ID = IT1.ID
  OT1.ID = IT1.ID の左外部結合 OT1
  WHERE T1.PIVOT = 1 または OT1.FOO=40) SRC
オン (SRC.ID = TARGET.ID)
一致した場合
UPDATE SET TARGET.V=SRC.NV
DELETE WHERE TARGET.V=SRC.V;

専念;

アイテムに新しいバージョンがある場合、アイテムは新しいバージョンで更新されます (UPDATE 句)。そうでない場合、アイテムは破棄されます (DELETE 句)。削除は行われるべきではありません

このステートメントは、期待どおりに機能しません。すべてのリンクを削除します。削除句が変更されたデータでサブクエリを実行するようなものでした。

ここでは役に立たないが、問題を引き起こしているように見える OT1.FOO=40 に注意してください。order byサブクエリに (順序基準に関係なく) を追加すると、ステートメントは正しく機能します。

ありがとう、

ニコラス

4

3 に答える 3

1

SQL 標準では、次の 3 つのフェーズが保証されています。

  1. 更新されるすべての行の新しい値を計算する (読み取り専用フェーズ)
  2. 変更は一度に適用されます
  3. 制約が検証される

これは、最初の書き込みが発生する前に、すべての「サブクエリ」が論理的に実行されることを意味します。これは、さまざまな物理プラン シェイプを使用して実装される可能性がありますが、アプリケーション ロジックには関係ありません。

于 2013-08-12T16:10:15.037 に答える