行断片(レコードピース)
通常 テーブルの 1レコードのデータは、1つのピース(行断片)でデータブロックに格納される。
1つの行断片の大きさ(バイト数)は固定長、または、可変長である。行断片の内部のバイト数は格納するデータ型、データの値(データの長さ)、そして個数によって変化する。
レコードピース(行断片)の構成
レコードヘッダ | レコードデータ |
(a) | (b) | (c) | (d) | 列ヘッダ1 | 列データ1 | 列ヘッダ2 | ・・・ | 列ヘッダ255 | 列データ255 |
レコードヘッダ(3 バイト〜)
(a) 行オーバヘッド (2 バイト〜)
(b) 列数 (1 バイト)
(c) クラスタキーID (0 バイト/? バイト) クラスタ化されている場合のみ(COLUMN_ID)
(d) 連鎖行断片 ROWID (0 バイト/ 6 or 10 バイト?) 行断片の断片化が発生している場合のみ
レコードデータ(最大 255 個の列データが格納可能)
- 列ヘッダ(列長)
データサイズが 250 バイト以下なら 1 バイト、251 バイト以上のときには 3 バイトを使用する。
- ブロック内断片
列数が 256 以上になると 連鎖行断片 ROWID を使用して分割格納される。行断片(レコードピース)は 2つ以上で構成され、同一データブロック に配置される。
そのため、行移行 や 行連鎖 のように複数のブロックへのIOは発生しない。
行移行、行連鎖も連鎖行断片ROWID を使用して複数のレコードピースでデータを格納している。
データ型による必要なバイト数:レコードピース 見積り用
予約領域 | レコードヘッダ | 固定 | 3 バイト |
列ヘッダ | 可変 | 0〜3 バイト: データ長が0〜250バイトなら 1バイト、251バイト以上なら 3 バイト (注意)データ長が 0 バイトでかつ、後続カラムのすべてが NULLの場合 0 バイトとなる。 =列データの最後の連続する NULL はすべて削除される。 |
文字型 | CHAR(byte_size) | 固定 | |
CHAR(char_size) | 可変 | キャラクタセットとデータによる ⇒マルチバイト・キャラクタセット参照 |
VARCHAR2(byte_size|char_size) | 可変 | データのバイト数 ⇒マルチバイト・キャラクタセット参照 |
NCHAR(char_size) | 固定 | char_size×1〜3 バイト ⇒マルチバイト・キャラクタセット参照 |
NVARCHAR2(char_size) | 可変 | データ文字数×1〜3 バイト ⇒マルチバイト・キャラクタセット参照 |
(LONG) | 可変 | データ長と同じ(下位互換用) |
数値型 | NUMBER(p, s) | 可変 | 1 + CEIL (p / 2) p=精度、 負数の場合+1 最大 21 バイト(精度が38桁以下の場合) |
NUMBER | 可変 | ROUND( (p+s)/2) )+1 p=指数表記での仮数部桁数、s=負数の場合1 それ以外は0 最大 21 バイト |
日付 ・期間型 | DATE | 固定 | 7 バイト |
TIMESTAMP | 可変 | 7 バイト 〜 最大(ナノ秒の場合) 11 バイト |
TIMESTAMP WITH TIME ZONE | 固定 | 13 バイト |
TIMESTAMP WITH LOCAL TIME ZONE | 可変 | 7 〜 11 バイト |
INTERVAL YEAR TO MONTH | 固定 | 5 バイト |
INTERVAL DAY TO SECOND | 固定 | 11 バイト |
バイナリ型 | RAW | 可変 | データ長と同じ |
(LONG RAW) | 可変 | データ長と同じ(下位互換用) |
L O B | BFILE | 固定 | 530 バイト |
CLOB | 可変 | 行外のみのロケータ 20 バイト 行内格納を許可している場合:ロケータが36〜86 バイト 36 バイト+データ長(行内格納)または 86 バイト(行外格納) 行内格納の場合 EMPTY_xLOB 状態で 36 バイト使用する |
NCLOB | 可変 |
BLOB | 可変 |
行断片 関連事項