Oracle Database 11g Release 2に関する10の重要なこと – askTom Live -
Point7: Deferred Segment Creation 【非同期セグメント作成】
オラクル・コーポレーション
サーバー・テクノロジー部門 シニア・テクニカル・アーキテクト兼エバンジェリスト
Thomas(Tom) Kyte (トム・カイト)
( 目次 )
7.Deferred Segment Creation 【非同期セグメント作成】
これまでは、表や索引を作成すると、そのセグメントに自動的に領域が割り当てられました。
小さなものでも、それが何千も積み重なれば大きな領域を占めます。
パッケージ・アプリケーションの多くでは、何千もの表を作成しながら、実際に使うのは100くらいの場合もあります。大量の領域を割り当ててスペースを無駄遣いし、データディクショナリをいっぱいにしてしまうようなことが起きているのです。
Oracle Database 11g R2では、初期エクステントの割当てを、データベースの表に最初に行が追加されるまで遅らせることができます。
さっそく見てみましょう。
まずは、この機能を無効にします。
この機能は、データベースレベルやセッションレベルでオン/オフ可能ですし、個々のCREATE文でもオン/オフを指定できます。
次に、t1という名前の表を作成します。すると、5つのエクステントが割り当てられます。表のために1つ、この表のプライマリキー用に1つ、表のUNIQUE制約用に1つで、残りの2つはLOB用です。1つのCREATE TABLE文で、5つのエクステントが割り当てられてしまったのです。
SQL> alter session set
2 deferred_segment_creation=false;
Session altered.
SQL> create table t1
2 ( x int
3 constraint t1_pk
4 primary key,
5 y int
6 constraint t1_y
7 unique,
8 z clob
9 )
10 lob( z )
11 store as t1_z_lob
12 (index t1_z_lobidx);
Table created.
SQL> select segment_name,
2 extent_id,
3 bytes
4 from user_extents
5 order by segment_name;
SEGMENT_NAM EXTENT_ID BYTES
----------- ---------- ----------
T1 0 65536
T1_PK 0 65536
T1_Y 0 65536
T1_Z_LOB 0 65536
T1_Z_LOBIDX 0 65536
次に、この機能を有効にして、今度はt2という名前で同じ表を作成します。
ユーザーエクステントを見てみると、さきほどとまったく変わりません。実際にこの表を使うまでは、新しいエクステントは追加されません。
SQL> alter session set
2 deferred_segment_creation=true;
Session altered.
SQL> create table t2
2 ( x int
3 constraint t2_pk
4 primary key,
5 y int
6 constraint t2_y
7 unique,
8 z clob
9 )
10 lob( z )
11 store as t2_z_lob
12 (index t2_z_lobidx);
Table created.
SQL> select segment_name,
2 extent_id,
3 bytes
4 from user_extents
5 order by segment_name;
SEGMENT_NAM EXTENT_ID BYTES
----------- ---------- ----------
T1 0 65536
T1_PK 0 65536
T1_Y 0 65536
T1_Z_LOB 0 65536
T1_Z_LOBIDX 0 65536
次に、INSERTを実行したあとでユーザーエクステントを見てみると、領域が割り当てられています。表や索引、LOBのために必要だからです。
表が空の間はエクステントは割り当てられず、本当に領域が必要なときに初めて割り当てられます。
つまり、インストールの際には、アプリケーションの動作に必要な領域だけが割り当てられることになります。エクステントの割当てが先延ばしされるわけです。
SQL> insert into t2 values ( 1, 2, 'hello world' );
1 row created.
SQL> select segment_name,
2 extent_id,
3 bytes
4 from user_extents
5 order by segment_name;
SEGMENT_NAM EXTENT_ID BYTES
----------- ---------- ----------
T1 0 65536
T1_PK 0 65536
T1_Y 0 65536
T1_Z_LOB 0 65536
T1_Z_LOBIDX 0 65536
T2 0 65536
T2_PK 0 65536
T2_Y 0 65536
T2_Z_LOB 0 65536
T2_Z_LOBIDX 0 65536
10 rows selected.
▲ ページTOPに戻る
Oracle Database 11g Release 2に関する10の重要なこと – askTom Live - 目次
Copyright © 2010, Oracle Corporation Japan. All rights reserved.
無断転載を禁ず
|
この文書はあくまでも参考資料であり、掲載されている情報は予告なしに変更されることがあります。日本オラクル社は本書の内容に関していかなる保証もいたしません。また、本書の内容に関連したいかなる損害についても責任を負いかねます。
Oracleは米国Oracle Corporationの登録商標です。文中に参照されている各製品名及びサービス名は米国Oracle Corporationの商標または登録商標です。その他の製品名及びサービス名はそれぞれの所有者の商標または登録商標の可能性があります。 |
Thomas(Tom) Kyte (トム・カイト)
2000年にAsk Tomブログ( http://asktom.oracle.com ) を開設して以来10年にわたり、全世界のオラクル技術者のありとあらゆる質問に答え、データベース技術の活用を世に広めてきた世界的に有名なエバンジェリスト。
|