PCTFREE
0.更新履歴
- 2001.04.28 新規作成
1.はじめに
このドキュメントでは,OracleのCreate Tablespace,Index,Table等で指定するオプションのPCTFREEについて説明する.
2.PCTFREEとは
PCTFREEとは,パーセントフリーの略である.
1ブロック内にあらかじめ確保される空き領域の割合(%)を指定するパラメータで,デフォルトは10%である.
これで確保された空き領域は,更新時に行データが大きくなる場合の予備領域として確保することになる.
3.行移行はあまりよくない
行データがあらかじめ確保しておいたブロックより大きくなった場合,別のブロックにその行を移動する. 元のブロックには,移動先のポインタアドレスが設定される.
この例では,VARCHAR型データに入るデータが大きくなったため,先に確保しておいたブロック1に入りきらないために発生した行移動にイメージである.
これが頻繁に発生していると,パフォーマンスの劣化となる.
よって,あらかじめ十分なPCTFREEを設定し,行移動が発生しないようにする.
4.固定長データでも行移動が発生する可能性がある
VARCHAR2型やNUMBER型のような可変長データ型の場合は行移動が発生しやすいが,固定長のCHAR型でも発生する可能性がある.
CHAR型では,INSERTされた時にデータがない場合(NULL)の場合は領域が確保されていない状態なので,データがセットされた時点で増える可能性がある.
5.検索用テーブルやインデックスのPCFTREEは少なくても良い
PCFREEを多く設定すると,データ格納効率(確保されるブロック数)が悪くなる.
よって,検索のみのテーブルは読み取りブロック数の削減なども考慮して,少なめに設定すればよい.(デフォルトの10%程度)
インデックスは,実際には固定長である場合が多いため,少なめに設定しておいても問題ない.
6.PCTUSEDとの関連
PCTUSEDは,ブロック内で利用することのできる最小の割合(%)である.
ブロックがPCTFREEで指定した限界まで満杯になると,そのブロックにおける割合がPCTUSEDより下になるまでOracleはそのブロックに新規データのINSERTを行わない.
PCTFREE + PCUSED < 100となるように設定する.