前回に引き続き、どうでもいい内容を検証していきます。
表領域にオブジェクトを作っていきます。
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