現場ニーズを追加するための大きなテーブル

テストの目的:

   顧客の需要には、次のセット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')

 

おすすめ

転載: www.cnblogs.com/lvcha001/p/11837569.html