30

デフォルト値と not null の制約を持つテーブルに列を追加する場合。データベースに負荷がかかっているときに、単一のステートメントとして実行するか、ステップに分割する方がよいでしょうか。

ALTER TABLE user ADD country VARCHAR2(4) DEFAULT 'GB' NOT NULL

ALTER TABLE user ADD country VARCHAR2(2)
UPDATE user SET country = 'GB'
COMMIT
ALTER TABLE user MODIFY country DEFAULT 'GB' NOT NULL
4

3 に答える 3

21

パフォーマンスは、使用する Oracle のバージョンによって異なります。とにかくロックが生成されます。

バージョン <= Oracle 11.1 の場合、#1 は #2 と同じことを行います。とにかく遅いです。Oracle 11.2 から、Oracle は最初のステートメントに優れた最適化を導入しました (1 つのコマンドですべてを実行します)。コマンドを変更する必要はありません。Oracle の動作が異なるだけです。各物理行を更新するのではなく、データ ディクショナリにのみデフォルト値を格納します。

しかし、私は過去にこの機能に関連するいくつかのバグに遭遇したことも言わなければなりません (Oracle 11.2.0.1 で)

  • エクスポートが direct=Y で行われた場合の従来のインポートの失敗
  • merge ステートメントは ORA-600 [13013] (内部オラクル エラー) をスローする可能性があります。
  • そのようなテーブルを使用したクエリでのパフォーマンスの問題

この問題は現在のバージョン 11.2.0.3 で修正されていると思いますので、この機能を使用することをお勧めします。

于 2013-05-15T12:25:06.107 に答える
0

システムでテーブルを使用する必要がある場合は、DBMS_Redefinitionが実際に唯一の選択肢です。

于 2012-05-17T10:58:26.650 に答える
0

少し前に、同じ問題の可能な解決策を評価しました。私たちのプロジェクトでは、テーブルのすべてのインデックスを削除し、変更を実行してインデックスを元に戻す必要がありました。

于 2012-05-17T10:29:57.717 に答える