テストの目的:
顧客の需要には、次のセット11.2.0.4環境、4G大きなテーブルには、フィールドを追加します。
この試験では、時間がかかり、アプリケーションレベルのロック、およびデフォルトのフィールド値、実メモリのテストを追加するかどうかから。
テストプロセス:
A.は、テストテーブルを作成します。
SQL> ドロップテーブルパージ。 表がドロップ。 SQLは >テーブルAを作成するよう 選択 * からDBA_OBJECTS。 表が作成されました。
SQL>のセットタイミング
多次循环插入
SQL> SELECT * FROMへの挿入。
22291968行が作成されました。
SQL> COMMIT;
SQL>セレクト合計(バイト)/ / 1024×1024 USER_SEGMENTSからここSEGMENT_NAME = 'A';
SUM(BYTES)/ 1024/1024
--------------------
4990
II。フィールドを追加し、追加のデフォルト
1)アプリケーションロックリソース
セッション1
SQL>削除AどこROWNUM = 1;
1行が削除されました。
セッション2
SQL>はALTERセッションのSET = 600 DDL_LOCK_TIMEOUT;
SQL> ALTER表Aの追加C_LHR VARCHAR2(100) 'LHRの' DEFAULT;
セッション、ライブロック、リソース問合せアプリケーションがハング
SQL>所有者= 'YZ' とOBJECT_NAME = 'A' DBA_OBJECTSからのobject_id選択し;
OBJECT_ID
----------
89526
SQL> SID、ID1、タイプ、LMODE、要求、CTIME、ID1 = 89526のV $ロックからブロックを選択します。
SID ID1 TY LMODE要求CTIME BLOCK
---------- ---------- - ---------- ---------- - --------- ----------
329 89526 TM 3 0 156 1
312 89526 TM 0 6 86 0申请TM 6!
2)更新時間
セッション1つのロールバック、操作が実行されるように自動的にフィールドを追加
SQL>ロール。
ロールバックが完了しました。
そして、パフォーマンス関連の!
イベントクエリ、ユーザーが実行しています
SQL> selectイベントは、ステータス= 'ACTIVE' と、ユーザー名= 'YZ' GVの$セッションからSID。
EVENT SID
------------------------------------------------ ----------------- ------
ログファイルのスイッチ(不完全なチェックポイント)312
クライアント329からのSQL * Netのメッセージ
テスト環境のログがフォーマットされ、そのため、ログファイルが非常に小さい、小さいログ・グループの数されていないので、最終的にセッションにつながる大幅に未完成の遅延時間の結果、および発生したアーカイブ・ログの数が多いためCKPTプロセスおよび待機です。
クエリ統計の実行ALTER TABLE操作セッションイベント統計
経過:00:40:59.26
CKPTプロセスを待っているデータベースで見つけることができるログ・スイッチのための15分を待って、20分間の完全な書き込みで、反対は速い4000万回に回を読ん物理単位の最大数が、わずか3分を費やした実際の時間です。
これは、の最適化を伴うが、この変更の観点に加え、デフォルト値から直接フィールド、貧しい効率、高コスト、数字ロックTM6ロックテーブルを追加しません。
III。フィールドを追加しますが、デフォルトなしに、後続のフィールドのデフォルト値を設定します
比較は、フィールドに厳格ではない時期に追加し、追加されました(ただし、テストの結果は、ライン上に反映することができます)
1)、および観察されたアプリケーションリソースロック
セッション1
SQL>削除AどこROWNUM = 1;
1行が削除されました。
セッション2
SQL> ALTER SESSIONセットDDL_LOCK_TIMEOUT = 600;
SQL> ALTER TABLE追加C_LHR_NEW VARCHAR2(100);
ライブセッションがハングアップし、アプリケーションのリソースのロックを確認します
SQL>所有者= 'YZ' とOBJECT_NAME = 'A' DBA_OBJECTSからのobject_id選択し;
OBJECT_ID
----------
89526
SQL> SID、ID1、タイプ、LMODE、要求、CTIME、ID1 = 89526のV $ロックからブロックを選択します。
SID ID1 TY LMODE要求CTIME BLOCK
------ ---------- - ---------- ---------- ----- ----- ----------
312 89526 OD 6 0 10 0
329 89526 TM 3 0 30 0
312 89526 TM 3 0 10 0
いいえ現象を遮断し、クエリのテスト環境では、アプリケーションがロックリソースTXで見つけることができ、セッションをブロック
SQL> SID、ID1、タイプ、LMODE、要求、CTIME、REQUEST> 0のV $ロックからブロックを選択します。
SID ID1 TY LMODE要求CTIME BLOCK
------ ---------- - ---------- ---------- ----- ----- ----------
312 131075 TX 0 4 0 74
TM> 3レベルのロックを追加するために、テーブルの上にはない見つけることができるテーブルをロックしますが、ビジネステーブルのDML操作がフィールドを追加することはできませんがありません。
2)観測時間が
ロールバックセッション1
SQLを> ROLLBACK;
セッション2第二の結果、すなわち、データ列、データ・ディクショナリに関連するだけで変更されたレコードの情報を変更しません。
クエリデータ
SQL>セット自動トレースTRACE
SQL> SELECT * FROMどこROWNUM = 1;
述語情報(オペレーションIDで識別):
----------------------------------------- ----------
1 - フィルタ(ROWNUM = 1)
3)デフォルト値を増やし、テーブルの新しい列に増加
SQL> ALTER TABLE MODIFY C_LHR_NEW VARCHAR2(100)DEFAULT 'LHR';
テーブルが変更されました。
経過:00:00:00.04秒の結果のうち、
クエリデータ
SQL>ここでROWNUM = 1からC_LHR_NEWを選択します。
C_LHR_NEW
------------------------------------------------- -------------------------------------------------- -
ヌル
SQL> ALTER TABLE MODIFY C_LHR_NEWないヌル
*
行1でERROR:
ORA-02296:(YZを。)を有効にすることはできません-ヌル値が見つかります
4)換言すれば、フィールドを追加し、デフォルト値を変更し、特性が原因列のNULL値を操作することができない変更、NOT NULL
さらにまた別の
SQL> ALTER TABLE追加C_LHR_NEW2 VARCHAR2(200)デフォルトの 'LHR' はヌル。
テーブルが変更されました。
経過:00:00:00.04秒のうち、
SQL> ROWNUM = 1 A FROM C_LHR、C_LHR_NEW、C_LHR_NEW2を選択します。
C_LHR C_LHR_NEW C_LHR_NEW2
---------- ---------- --------------------
LHR LHR
実店舗データまたは他のデータが格納されている方法であれば5)、上記の方法、データのクエリを使用して
テストテーブルを作成します。
SQL>はDBA_OBJECTSから選択*としてテーブルBを作成します。
nullでないSQL> ALTER TABLE Bは追加c_nameのVARCHAR2(100)デフォルトの 'LHR';
SQL> Bから選択数(*)ここで、c_name = 'CC';
COUNT(*)
----------
0
SQL>テーブル(dbms_xplan.display_cursor)から選択します*;
PLAN_TABLE_OUTPUT
------------------------------------------------- --------------------------
SQL_IDの9qj24brgbnrkg、児童数0
------------------ -------------------
Bからのカウント(*)を選択する場所c_name = 'CC'
計画ハッシュ値:749587668
-------------------------------------------------- -------------------------
| 同上| 操作| 名前| 行| バイト| コスト(%のCPU)| 時間|
-------------------------------------------------- -------------------------
| 0 | SELECTステートメント| | | | 347(100)| |
| 1 | SORT AGGREGATE | | 1 | 52 | | |
| * 2 | TABLE ACCESS FULL | B | 14 | 728 | 347(1)| 夜12時00分05秒|
-------------------------------------------------- -------------------------
述語情報(オペレーションIDで識別):
----------------------------------------- ----------
2 - フィルタ(NVL( "C_NAME"、 'LHR')= 'CC')
つまり、このようにして作成されたOracle列に対して、ある実際にデータを格納しませんが、汀を用いたディスプレイクエリパラメータにはデータがNULL値、LHRのデフォルトのデータ値は表示されませんされている場合
SQL>更新Bセットc_nameのobject_id = 20 = 'DD'。
SQL> COMMIT;
SQL> Bから選択数(*)ここで、c_name = 'DD';
COUNT(*)
----------
1
2 - フィルタ(NVL( "C_NAME"、 'LHR')= 'DD')