今日もなんだかいい天気♪

アクセスカウンタ

help リーダーに追加 RSS ブロックの割り当ての様子をもう一度確認してみる。

<<   作成日時 : 2009/01/08 22:45   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

昨日書いた内容があまりにもみにくいので、あらためてまとめてみる。

作成したテーブル。

画像


可変長のカラムより固定長の方がサイズが読みやすいので、あえて1000バイトのCHAR型を3列作っている。
DB_BLOCK_SIZEは8192バイト。
これで、1ブロックに2レコード格納できる。

で、これから頻繁にinsertしたりブロック数を確認したりするので、以下のSQLを用意した。

<insertするためのPL/SQL 「insert.sql」>
begin
for i in &CNT1...&CNT2 loop
insert into HR.TEST01 values (i,'AAAAA','BBBBB','CCCCC',sysdate);
end loop;
end;
/


(※&CNT1と&CNT2のあいだに.を3個置いているけれど、ミスじゃないです。)

<ブロックサイズとかを確認するSQL 「table_check.sql」>
select a.table_name,a.blocks,a.empty_blocks,a.avg_space,a.num_rows,b.blocks,b.extents
from dba_tables a,dba_segments b
where a.owner='HR' and a.table_name='TEST01' and a.table_name=b.segment_name;



じゃ、テーブルにinsertする前の状態を確認。
画像

セグメントに1エクステント(8ブロック)割り当てられている(右のBLOCKS列)。
テーブルには0ブロック(左のBLOCKS列)。未使用ブロック(EMPTY_BLOCKS)(セグメントに割り当てられているが、テーブルに割り当てられていないブロック)は8ブロック。


で、1レコード挿入する。
すると、テーブルに5ブロック割り当てられる。未使用ブロックは3ブロックになる。
実際、1ブロックで2レコード入るはずなので、1ブロックあれば十分。でも、5ブロック割り当てられる。
画像



5ブロック割り当てられたので、5ブロック分のレコード=10レコードにする。
画像

きっちり5ブロックに収まるので、5ブロックのまま増えていない。

さらに、1レコード追加する。
新たにブロックが割り当てられるはずだ。
画像

たぶん、さらに5ブロック割り当てようとした。
でも、未使用ブロックは3つ。5ブロックはない。
そのため、新しいエクステントをセグメントに割り当て、そこから5ブロック割り当てた。
結果、テーブルには13ブロック割り当てる結果になった(既に割り当て済みのエクステント分8ブロック+新たに割り当てられた5ブロック)。
で、13ブロック分、26レコードにしてみたが、予想通りブロック数は増えていない。


27レコード目を挿入する。
ここで計算が狂う。
予想では、5ブロック割り当てようとするが未使用ブロックは3しかないので、新たにエクステントを割り当て、そこから5ブロック割り当てる。
つまり、テーブルには21ブロック割り当てられる(8+8+5)と予想した。
でも結果は20ブロックだった。
画像



同様に、20ブロック分のレコード(40レコード)になるように挿入し、さらに1ブロック追加した。
結果、テーブルに割り当てられたのは28ブロック。8+8+8+4ブロックだ。
画像



このへんの「自動割り当て」の動きは、もうちっと勉強しなくちゃいけないのかもしれない。
いや、この動きはOracleさんにしかわからないのかもしれないが。

※一応、HWMの様子をなまあたたかく見つめる。につづいている。

設定テーマ

注目テーマ 一覧

月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文