|
昨日書いた内容があまりにもみにくいので、あらためてまとめてみる。 作成したテーブル。 可変長のカラムより固定長の方がサイズが読みやすいので、あえて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の様子をなまあたたかく見つめる。につづいている。 |
| << 前記事(2009/01/08) | トップへ | 後記事(2009/01/08)>> |
| タイトル (本文) | ブログ名/日時 |
|---|
| 内 容 | ニックネーム/日時 |
|---|
| << 前記事(2009/01/08) | トップへ | 後記事(2009/01/08)>> |