スライド 10 / 21
説明:
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.