2012年9月10日月曜日

INITIAL_EXTENTと遅延セグメント作成な話2


前回に引き続き、どうでもいい内容を検証していきます。


表領域にオブジェクトを作っていきます。


SQL> create table test_ext(co1 number) tablespace TEST_EXT;

表が作成されました。


SQL>  select OWNER,SEGMENT_NAME,EXTENT_ID,BLOCKS,BYTES from dba_extents where TABLESPACE_NAME like 'TEST_EXT%';

OWNER  SEGMENT_NAME     EXTENT_ID     BLOCKS      BYTES
------- --------------- ---------- ---------- ----------
SYS        TEST_EXT                   0                  8              65536



SQL>  select TABLESPACE_NAME,BLOCK_ID,BYTES,BLOCKS from dba_free_space where tablespace_name like 'TEST_EXT';

レコードが選択されませんでした。


うんうん。データベース記憶域の割当ての論理単位はエクステント単位だもんね。
MIN_EXTENTSの1エクステント(8ブロック)使っちゃったもんね。うんうん。


うん・・・

ん??


あえ、確か最近のバージョンからは、オブジェクト作成しただけじゃ、
セグメント作成(領域獲得)しなくて、行が挿入されたときに初めて、
セグメント作成されるんじゃなかったっけ、、、

えっとぉ、、、
そうそう、11.2.0.1.0からの新機能「遅延セグメント作成」
※パーティションは11.2.0.2.0からなので、要注意。

詳しくは、Oracle® Database概要 11gリリース2(11.2) 12章 論理記憶域構造 参照


確認してみます。


SQL> show parameter DEFERRED_SEGMENT_CREATION

NAME                                 TYPE        VALUE
----------------------- ----------- ------------------------------
deferred_segment_creation     boolean     TRUE



遅延セグメント圧縮機能は有効になっています。



SQL> select OWNER,TABLE_NAME,SEGMENT_CREATED from dba_tables where table_name='TEST_EXT';

OWNER       TABLE_NAME     SEGMENT_CREATED
--------- --------------- -------------------
SYS           TEST_EXT                      YES



でもセグメント作られてますな。。。


そもそもSYSで作ったのがいけないのかなぁ。。怪しそう。。。


試します。



SQL> create tablespace test_ext2 datafile 'C:\app\oracle\oradata\orcl\test_ext2_01.dbf' size 81K;

表領域が作成されました。



SQL> select TABLESPACE_NAME,BLOCK_ID,BYTES,BLOCKS from dba_free_space where tablespace_name like 'TEST_EXT%';

TABLESPACE_NAME       BLOCK_ID   BYTES     BLOCKS
--------------------- ---------- ---------- ----------
TEST_EXT2                             4      65536              8




SQL> alter user hoge quota unlimited on TEST_EXT2;

ユーザーが変更されました。


SQL> connect hoge/hoge
接続されました。


SQL> create table test_ext2(co1 number) tablespace TEST_EXT2;

表が作成されました。




SQL> select owner,tablespace_name,table_name,segment_created from dba_tables where table_name like 'TEST_EXT%';

OWNER      TABLESPACE_NAME TABLE_NAME SEGMENT_CREATED
---------- ---------------     ----------    --------------------
SYS            TEST_EXT              TEST_EXT         YES
HOGE          TEST_EXT2            TEST_EXT2        NO


お、HOGEのTEST_EXT2はセグメント作成されていない。



SQL>  select OWNER,SEGMENT_NAME,EXTENT_ID,BLOCKS,BYTES from dba_extents where TABLESPACE_NAME like 'TEST_EXT%';

OWNER  SEGMENT_NAME     EXTENT_ID     BLOCKS      BYTES
------- --------------- ---------- ---------- ----------
SYS          TEST_EXT                   0              8        65536


うんうん。HOGEのTEST_EXT2がない。
※dba_extentsはセグメントを含むエクステントの情報だから



SQL> select TABLESPACE_NAME,BLOCK_ID,BYTES,BLOCKS from dba_free_space where tablespace_name like 'TEST_EXT%';

TABLESPACE_NAME   BLOCK_ID      BYTES     BLOCKS
---------------    ---------- ---------- ----------
TEST_EXT2                    4         65536          8




うん。うん。空いてますな。



ということで、SYSのオブジェクトは遅延セグメント作成しないってことだな。


という内容が、KROWNの文書番号:137280が遅延セグメント作成機能についてですが、
やっぱりSYSは対象外と書いてありますね。




SQL> connect hoge/hoge
接続されました。
SQL> insert into test_ext2 values(1);

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> connect /as sysdba
接続されました。
SQL> select owner,tablespace_name,table_name,segment_created from dba_tables where table_name like 'TEST_EXT%';

OWNER      TABLESPACE_NAME TABLE_NAME  SEGMENT_CREATED
---------- ---------------   ----------   --------------------
SYS          TEST_EXT            TEST_EXT      YES
HOGE        TEST_EXT2          TEST_EXT2     YES




SQL>  select TABLESPACE_NAME,BLOCK_ID,BYTES,BLOCKS from dba_free_space where tablespace_name like 'TEST_EXT%';

レコードが選択されませんでした。




SQL>   CREATE TABLE TEST_EXT3(col1 number)
  2    STORAGE(INITIAL 100M) TABLESPACE TEST_EXT2;

とかやっても、領域は取得しないし、表領域は拡張しないし、
データファイルも大きくならないので、勘違いは禁物ってことで。


SQL> CREATE TABLE TEST_EXT3(col1 number) SEGMENT CREATION IMMEDIATE
  STORAGE(INITIAL 100M) TABLESPACE TEST_EXT2;



データ挿入時に領域獲得させたくないとかであれば、
「SEGMENT CREATION IMMEDIATE」付けましょう。



ということで、だから何?って感じですが、満足したのでした。


次回:INITIAL_EXTENTと遅延セグメント作成な話3


0 件のコメント:

コメントを投稿