Oracleデータブロック
ブロック・ヘッダー
表ディレクトリー
行ディレクトリー
行データ
空き領域
PCTFREE
PCTUSED
前のスライド
次のスライド
最初のスライドに戻る
グラフィックスの表示
Notes:
Oracleデータベースの最小I/O単位を『Oracleデータブロック』と言います。
このOracleデータブロックの内部構造について説明します。
Oracleデータブロックのサイズは、データベースを作成する時に決め、その後変更することはできません。
既定値は2,048バイトですが、最近サーバの性能が向上し、扱うデータ量も増えてきたため、データベースを作成する際このデータブロックのサイズを指定するようになりました。Oracleデータブロックのサイズは、更新系のデータベースは小さい方がパフォーマンスが良く、検索系のデータベースは大きい方がパフォーマンスが良いです。(例えば、更新系なら8KB、検索系なら32KBぐらいにします)
データ・ブロックに、複数の行データが格納されます。
データ・ブロックは、最小I/O単位ですので、1行のサイズよりデータ・ブロックのサイズを大きくします。そうしないと1行読むために複数のデータ・ブロックをアクセスすることになります。
行データは可変長です。下記にデータ型毎のバイト数を説明します。
1. NUMBER型 ・・・ 値の桁数÷2+1 (BCD形式)
2. VARCHAR2型 ・・・ 値の桁数
3. CHAR型 ・・・ 値の桁数=有効桁の固定長
4. DATE型 ・・・ 7バイトの固定長
行データの各列データ毎の間には、1バイトのデリミタコードが入ります。
1行のサイズは格納される値によって変わりますので、『平均行サイズ』(Average row length:アベレージローレン)で求めます。
データ・ブロックには、行データ以外に下記の情報が入っています。
1. ブロック・ヘッダー ・・・ 普通は80バイトとられます。(正式には、53+23×INITRANS)
ブロック・ヘッダーの中に、『トランザクション・エントリー』というデータ・ブロックを更新するトランザクションを制御する領域があります。表を作成する際指定できるトランザクション管理パラメータであるINITRANSの規定値が1である為、53+23x1=80バイトになります。
2. 表ディレクトリー ・・・ 普通は4バイトです。(正式には、1つの表に対して4バイト)
3. 行ディレクトリー ・・・ 1行ごとに2バイト使用します。
逆に考えると、行データは、データ・ブロック一杯に格納することはできません。(ブロック・ヘッダーと表ディレクトリーで最低84倍と使用します。データ・ブロックが2048バイトの場合は、空きは1964バイトです)
行データは、データ・ブロックの空き領域いっぱいには登録されません。
INSERT命令によって、データ・ブロックの空き領域に順次行データが登録されるのですが、記憶領域管理パラメータのPCTFREEに指定される割合の空き領域を確保します。
PCTFREE(Percent free:パーセントフリー)とは、空き領域率のことであり、規定値は10%です。
PCTFREEは、そのデータ・ブロックに登録されている行データが更新され行データのサイズが大きくなることに備える比率のことです。
この比率を限りなく0にして行データを登録し、サイズが大きく更新されると、行データが複数のデータ・ブロックにまたがり記憶されます。これを『行連鎖』(chain rows:チェーンローズ)と言い、検索のパフォーマンスが悪くなる原因になります。
更新系の表はPCTFREEを大きく、検索系の表はPCTFREEを小さく指定します。
データ・ブロック内に、行データをどんどん登録していき、PCTFREEの空き領域に達すると、そのデータ・ブロックには登録されなくなり、次のデータ・ブロックを使用するようになります。
一度登録されなくなったデータ・ブロックは、記憶領域管理パラメータのPCTUSEDに指定する割合まで行データの使用率が下がるまで行データは追加登録されません。
PCTUSED(Percent used:パーセントユーズド)とは、行データの使用率のことであり、規定値は40%です。
PCTUSEDは、そのデータ・ブロックに登録されている行データが、UPDATEまたはDELETE命令によって指定された使用率までに下がるまでそのデータ・ブロックに行データをINSERTしないという比率のことです。
更新系の表はPCTUSEDを小さく、検索系の表はPCTUSEDを大きく指定します。
(C) 2004 HiroLaboratory. All rights reserved.