ローカルエクステントマネージメントに関する検証 その5

~ローカルエクステントマネージメントに関する検証 その5~
ペンネーム ちゃむ

————————————————————————–
8iからの新機能ローカルエクステントマネージメントを以下「LOCAL」と呼ぶ。
従来のデータディクショナリーでエクステントを管理する方法を以下「DICTIONARY」
と呼ぶ。
————————————————————————–

前回は、「LOCAL」で管理されている領域に対して、db_block_sizeを変えたときの
動きに関して説明した。
今回は、前回の未検証分「FFFFFFFFFFFFFF0F」の気になる0の位置に関して検証する。

検証手順(以下のすべての検証結果は、DB_BLOCK_SIZE = 2Kで行ったものである)

1.「LOCAL」を作成する
2. その「LOCAL」に 1 UNIFORM SIZE分のテーブルを60個作成する

「2」においては、検証スクリプトとして、自社開発言語「SQeeL(スキール)」を用いております。
*詳細をご希望の方は、弊社までお問い合わせください。
mailto:insight-mktg@insight-tec.co.jp

1.「LOCAL」を作成する

CREATE TABLESPACE tbs_u_1 DATAFILE 'c:tbs_u_1.ora' SIZE 1024K
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 8K;

作成直後のDBA_FREE_SPACEの様子

TABLESPACE_NAME  FILE_ID  BLOCK_ID  BYTES   BLOCKS
--------------------------------------------------
TBS_U_1          25       33         983040  480

2.自社開発言語SQeeLによる「LOCAL」に 1 UNIFORM SIZE分のテーブル
を60個作成する

———————–SQeeLスクリプト始め————————–

global n , i
connect scott/tiger

    /*
    簡単なエラーメッセージ及び正常処理メッセージ
    dberrは上記connect文によって返される戻り値 
    正常時    0
    エラー時  パスワードが間違っているときなどのORA-01017
              エラーの数字部分「1017」などが入る
    */
    if dberr==0
         print('ok ok okよ')
    else
         print('${dberr}だめだめだめよ')
    endif

n=60
/*ループ60回*/
loop i=0; i<n; i++

    /*
    tbs_u_tbl_0, tbs_u_tbl_1,tbs_u_tbl_2のように
    ループするごとに順番に1 UNIFORM SIZE分のテーブルを作成していく
    ${変数}は中の変数を値に展開するものである。
    また、initial 2kとしておけば、UNIFORM SIZE=8K丸められる。
    */ 
    sql CREATE TABLE tbs_u_tbl_${i}
    (col number) 
    storage (initial 2k next 2k minextents 1 pctincrease 0) 
    tablespace tbs_u_1;

	/*簡単なエラーメッセージ及び正常処理メッセージ*/
	if dberr==0
		print('ok ok okよ')
	else
		 print('${dberr}だめだめだめよ')
	endif

	/*ビットマップ情報が格納されるブロックダンプ出力*/
	sql alter system dump datafile 25 block 3;

	/*簡単なエラーメッセージ及び正常処理メッセージ*/
	if dberr==0
		print('ok ok okよ')
	else
		print('${dberr}だめだめだめよ')
	endif
endloop
logout

———————–SQeeLスクリプト終わり————————

重要なところのみコメントを付加したので読んでみてほしい。

では、このときのビットマップ情報の変化を見ていこう。

「0100000000000000」→「0300000000000000」→「0700000000000000」→
「0F00000000000000」→「1F00000000000000」→「3F00000000000000」→
「7F00000000000000」→「FF00000000000000」→「FF01000000000000」→
「FF03000000000000」→「FF07000000000000」→「FF0F000000000000」→
「FF1F000000000000」→「FF3F000000000000」→「FF7F000000000000」→
「FFFF000000000000」→「FFFF010000000000」→「FFFF030000000000」→
「FFFF070000000000」→「FFFF0F0000000000」→「FFFF1F0000000000」→
「FFFF3F0000000000」→「FFFF7F0000000000」→「FFFFFF0000000000」→
「FFFFFF0100000000」→「FFFFFF0300000000」→「FFFFFF0700000000」→
「FFFFFF0F00000000」→「FFFFFF1F00000000」→「FFFFFF3F00000000」→
「FFFFFF7F00000000」→「FFFFFFFF00000000」→「FFFFFFFF01000000」→
「FFFFFFFF03000000」→「FFFFFFFF07000000」→「FFFFFFFF0F000000」→
「FFFFFFFF1F000000」→「FFFFFFFF3F000000」→「FFFFFFFF7F000000」→
「FFFFFFFFFF000000」→「FFFFFFFFFF010000」→「FFFFFFFFFF030000」→
「FFFFFFFFFF070000」→「FFFFFFFFFF0F0000」→「FFFFFFFFFF1F0000」→
「FFFFFFFFFF3F0000」→「FFFFFFFFFF7F0000」→「FFFFFFFFFFFF0000」→
「FFFFFFFFFFFF0100」→「FFFFFFFFFFFF0300」→「FFFFFFFFFFFF0700」→
「FFFFFFFFFFFF0F00」→「FFFFFFFFFFFF1F00」→「FFFFFFFFFFFF3F00」→
「FFFFFFFFFFFF7F00」→「FFFFFFFFFFFFFF00」→「FFFFFFFFFFFFFF01」→
「FFFFFFFFFFFFFF03」→「FFFFFFFFFFFFFF07」→「FFFFFFFFFFFFFF0F」

始めの8つのビットの変化の動きを細かく見ていこう。
始めの16進数の2桁を組にして2進数に直すと次のようになる。

tbs_u_tbl_0 テーブル作成後   「01」→「00000001」
tbs_u_tbl_1 テーブル作成後   「03」→「00000011」
tbs_u_tbl_2 テーブル作成後   「07」→「00000111」
tbs_u_tbl_3 テーブル作成後   「0F」→「00001111」
tbs_u_tbl_4 テーブル作成後   「1F」→「00011111」
tbs_u_tbl_5 テーブル作成後   「3F」→「00111111」
tbs_u_tbl_6 テーブル作成後   「7F」→「01111111」
tbs_u_tbl_7 テーブル作成後   「FF」→「11111111」

これで「FFFFFFFFFFFFFF0F」の途中で0が現れる意味も理解できるだろう。

と、ここまで書いてみて、こんなこと知っていてなんのためになるんだと
お思いの方もいると思うが、「平にご容赦ください。」

でも、謎は解かなきゃ!!!

ORACLE OPEN WORLD出展が決まりました。
メルマガ購読者にはもれなく….
こうご期待!!

以上 ジャスコができた 茅ヶ崎にて