デフォルト値と非ヌルの制約を持つテーブルに列を追加する場合。単一のステートメントとして実行するか、複数のステップに分割することをお勧めしますデータベースに負荷がかかっているときに
ALTER TABLE user ADD country VARCHAR2(4) DEFAULT 'GB' NOT NULL
VERSUS
ALTER TABLE user ADD country VARCHAR2(2)
UPDATE user SET country = 'GB'
COMMIT
ALTER TABLE user MODIFY country DEFAULT 'GB' NOT NULL
パフォーマンスは、使用するOracleバージョンによって異なります。とにかくロックが生成されます。
バージョン<= Oracle 11.1の場合、#1は#2と同じ動作をします。とにかく遅いです。 Oracle 11.2から、Oracleは最初のステートメント(1つのコマンドですべてを実行)に最適化を導入しました。コマンドを変更する必要はありません-Oracleの動作は異なります。各物理行を更新するのではなく、データディクショナリのみにデフォルト値を保存します。
しかし、この機能に関連する過去のバグ(Oracle 11.2.0.1)に遭遇したことも言わなければなりません。
この問題は現在のバージョン11.2.0.3で修正されたため、この機能を使用することをお勧めします。
しばらく前に、同じ問題の可能な解決策を評価しました。このプロジェクトでは、テーブルのすべてのインデックスを削除し、変更を実行してインデックスを復元する必要がありました。
システムでテーブルを使用する必要がある場合、DBMS_Redefinitionが唯一の選択肢です。