数日前に同僚の一人が並列MERGE文章の実行計画の解析に困っていることを見て、次のようにステップーバイーステップの説明をしました。次のSQL文は並列に実行されるでしょうか。|-------------------------------------------------------答えはNOです。段階2番から分かるように、MERGEパート自体は直列に実行されます。DMLが活性化されていないからでしょう。DMLを活性化したらどうなれるか確認してみます。|-------------------------------------------------------また、MERGEパートが直列に実行されています。並列MERGEはもっと正確なヒントを必要にするみたいです。これは当たり前でしょう。MERGE文章は2つ以上のテーブルを使用するから。PARALLELヒントにエイリアスを追加してみましょう。|----------------------------------------------------今度こそ、MERGEパートがちゃんと並列に実行されています。注意すべきのことがもう1つあります。対象テーブルT1に新しいインデックスをつけ、どんな変化が起こるか確認してみましょう。MAINTENANCEと言う新しい段階が現れます。インデックスメンテナンスのためにもう一つのテーブルキューTQ10004が使用されることも分かります。問題は、なぜここでインデックスメンテナンスをするのかということです。並列MERGEは並列UPDATEと並列INSERTで構成されます。並列INSERTとはダイレクトパスINSERTです。ダイレクトパスINSERTが終わったら、インデックスに変更内容を反映しなければなりません。OracleはダイレクトパスINSERTの後で、インデックスのメンテナンスをするようになっています。この機能は_idl_conventional_index_maintenanceという隠しパラメーターで制御されます。MAINTENANCEの段階はインデックスをUNUSABLEさせても消えません。実際に実行する際にはUNUSABLE状態のインデックスはメンテナンスされないはずです。|---------------------------------------------------------------私の説明が役に立ったのか分かりませんが、ともかくこのようにブログに残します。