web-dev-qa-db-ja.com

負荷がかかっているときにデフォルト値で列を追加する最良の方法

デフォルト値と非ヌルの制約を持つテーブルに列を追加する場合。単一のステートメントとして実行するか、複数のステップに分割することをお勧めしますデータベースに負荷がかかっているときに

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
22
Ben George

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

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

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

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

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

18
Roman Krüger

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

0
Dewfy

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

0
David Aldridge