3.2.5 レコード格納時の空き領域の作成(サブページ分割をしない場合)
HiRDB/SDデータベース作成ユティリティ(pdsdblod)でのレコード格納時に,ページ内にレコードを格納しない領域(未使用領域)を作成したり,セグメント内に使用しない空きページ(セグメント内の空きページ)を作成したりできます。
また,SDBデータベースを操作するAPIによるレコード格納時に,PCTFREE有効化オプションを指定すると,SDBデータベース格納定義のPCTFREE句で指定したページ内の未使用領域の比率を有効にしてレコードを格納できます。PCTFREE有効化オプションは,4V FMBまたは4V AFMのSDBデータベースの場合に指定できます。
ページ内の未使用領域の比率やセグメント内の空きページの比率は,次の個所で指定できます。
-
SDBデータベース格納定義のPCTFREE句
PCTFREE句については,次の個所を参照してください。
-
4V FMBのSDBデータベースの場合:「11.5.2(3)(j) PCTFREE」
-
4V AFMのSDBデータベースの場合:「11.6.2(3)(j) PCTFREE」
-
SD FMBのSDBデータベースの場合:「11.7.2(3)(j) PCTFREE」
-
-
HiRDB/SDデータベース作成ユティリティ(pdsdblod)のenvironment文recfreeオペランド
environment文のrecfreeオペランドについては,「12.3.1 environment文」を参照してください。
PCTFREE句とrecfreeオペランドの使い分けについては,「(3) PCTFREE句とrecfreeオペランドの使い分け」を参照してください。
空き領域の作成イメージを次の図に示します。
なお,この項の説明中の「データロード」については,HiRDB/SDデータベース作成ユティリティ(pdsdblod)によるフォーマットライト機能を使用したレコードの格納も含みます。
- 〈この項の構成〉
(1) 空き領域を作成する目的
空き領域を作成する目的を次に示します。
(a) データロード後のレコード格納に備えて空き領域を確保する
データロードしたあとに,子レコードを格納する場合,データロード時に作成したページ内の未使用領域,セグメント内の空きページを使用することで,同一ルートレコード下のレコードの近傍に子レコードを格納できます。
ページ内の未使用領域は,次の場合に使用されます。
-
SDBデータベース定義のSET句下のORDER句でSORTED DUPLICATES PROHIBITEDを指定し,格納済みのレコードが持つユーザキーの中間のキーを持つレコードを格納する場合
-
SDBデータベース定義のSET句下のORDER句でLASTを指定した場合や,ORDER句でSORTED DUPLICATES PROHIBITEDを指定して,最大のユーザキーを持つレコードを格納する場合で,基準ページおよびそのファミリ内接続ページに未使用領域があるとき
ファミリ内接続ページについては,「2.6.1(2) ページ間の関連づけとファミリ内接続ページ」を参照してください。
セグメント内の空きページは,次の場合に使用されます。
-
基準ページおよびその前後のファミリ内接続ページに未使用領域がない場合
-
データロードしたあとに,格納するレコードにページ切り替え('O'または'C')を指定した場合
-
基準レコードがページ切り替えの'O'指定をされたレコードのため,基準ページへの格納ができない場合
-
事前割り当てページ内にレコードを格納できる空き領域がないため,事前割り当てページへの格納ができない場合
データロードをしたあとのレコード格納による空き領域の使用例(SDBデータベース定義のSET句下のORDER句でSORTED DUPLICATES PROHIBITEDを指定した場合)を次の図に示します。
データロードしたあとのレコード格納による空き領域の使用例(SDBデータベース定義のSET句下のORDER句でLASTを指定した場合)を次の図に示します。
(b) ページに格納するレコード件数を制限する【4V AFM】
HiRDB/SDでは,複数のトランザクション間の整合性を保つために,ページ単位で排他制御をしています。そのため,1ページ内に格納されるレコード件数が多いほど,排他の競合が発生しやすくなります。そこで,ページ内の未使用領域の比率を指定して1ページ内に格納するレコード件数を制限することで,排他の競合を抑えることができます。
ページ内の未使用領域の比率の指定によって,ページに格納するレコード件数を制限する例を次の図に示します。なお,ページに格納するレコード件数を制限する場合は,SDBデータベースを操作するAPIによるレコード格納時に,PCTFREE有効化オプションを指定する必要があります。SDBデータベースを操作するAPIについては,マニュアル「TP1/Financial Service Platform プログラム作成の手引」を参照してください。
(2) ページ内の未使用領域の比率,セグメント内の空きページの比率の適用基準
ページ内の未使用領域の比率,セグメント内の空きページの比率の適用基準を次に示します。
(a) ページ内の未使用領域の比率の適用基準
次のような場合は,ページ内の未使用領域の比率の設定を検討してください。
-
SDBデータベース定義のSET句下のORDER句でSORTED DUPLICATES PROHIBITEDを指定している場合で,データロード後に格納するレコードに,格納済みのレコードが持つユーザキーの中間のキーを持つレコードがあるとき
-
ページ内に格納するレコード件数を制限して,ページによる排他の影響範囲を限定したいとき(4V AFMのSDBデータベースの場合)
上記の条件に該当しないときは,ページ内の未使用領域の比率に0を指定してください。
(b) セグメント内の空きページの比率の適用基準
次のような場合は,セグメント内の空きページの比率の設定を検討してください。
-
SDBデータベース定義のSET句下のORDER句でLASTを指定した場合,またはORDER句でSORTED DUPLICATES PROHIBITEDを指定しても,ユーザキーの昇順にレコードを格納することがわかっているとき
-
データロード後に格納する子レコードが,ページ内の未使用領域だけでは格納しきれないとき
-
データロード時にページ切り替えを指定していて,ページを占有したレコードがあるとき
-
データロード後に,ページ切り替え指定('C'指定または'O'指定)で格納するレコードがあるとき
上記の条件に該当しないときは,セグメント内の空きページの比率に0を指定してください。
(3) PCTFREE句とrecfreeオペランドの使い分け
HiRDB/SDデータベース作成ユティリティ(pdsdblod)のenvironment文でrecfreeオペランドを指定すると,SDBデータベース格納定義のPCTFREE句で指定したページ内の未使用領域の比率,およびセグメント内の空きページの比率は無視され,recfreeオペランドの指定値に従って空き領域が作成されます。
そのため,ページ内の未使用領域の比率,およびセグメント内の空きページの比率の指定は次のように指定してください。
-
データロード時に,データロード後のレコード格納に備えて空き領域を確保する場合
recfreeオペランドで指定してください。
-
4V AFMのSDBデータベースで,ページに格納するレコード件数を制限する場合(PCTFREE有効化オプションを指定して,SDBデータベースを操作するAPIによるレコード格納時にレコード件数を制限する場合)
SDBデータベース格納定義のPCTFREE句を指定してください。
4V AFMのSDBデータベースのデータロード時に,データロード後のレコード格納に備えて空き領域を確保し,かつSDBデータベースを操作するAPIによるレコード格納時にレコード件数を制限したい場合は,それぞれの目的に合わせてrecfreeオペランド,PCTFREE句の指定値を見積もってください。
(4) ページ内の未使用領域の比率,およびセグメント内の空きページの比率に関する留意事項
ページ内の未使用領域の比率,およびセグメント内の空きページの比率に関する留意事項を次に示します。
(a) 未使用領域の比率および空きページの比率の指定に関する留意事項
-
セグメント内の空きページの比率には,50%を超える値を指定できません。レコード格納時にセグメント内の空きページを使い切った場合,HiRDB/SDは,ほかのセグメント内の空きページを割り当ててレコードを格納します。そのため,ファミリ単位の近傍配置ができないことがあります。
-
4V FMBまたはSD FMBのSDBデータベースでは,ルートレコードの格納ページの排他によって,ルートレコード下のレコードへのアクセスをシリアライズするため,レコード件数の制限による同時実行性が向上する効果はありません。このため,レコード件数を制限する目的でのページ内の未使用領域の比率には0を指定してください。
-
フォーマットライトを行うSDBデータベースの場合,ページ内の未使用領域の比率,およびセグメント内の空きページの比率に0を指定してください。ただし,ページに格納するレコード件数を制限したい場合は,ページ内の未使用領域の比率を指定してください。
-
4V AFMのSDBデータベースでOCCURRENCE NUMBER句の指定が0の場合,仮想ルートレコード下には最大1件の子レコードしか存在しません。そのため,ページ内の未使用領域の比率には0を指定してください。
(b) 未使用領域および空きページの作成に関する留意事項
-
ページ内の未使用領域の比率に関係なく,ページには最低1件のレコードが格納されます。このため,指定した比率の未使用領域が作成されないことがあります。
-
HiRDB/SDデータベース作成ユティリティ(pdsdblod)で事前割り当てページにレコードを格納する場合,ページ内の未使用領域の比率の指定は無視され,0%が指定されたものとして動作します。このため,指定した比率の未使用領域は作成されません。また,レコードは詰めて格納されます。
-
HiRDB/SDデータベース作成ユティリティ(pdsdblod)の実行時に,事前割り当てページを確保する際,セグメント内の空きページの比率の指定は無視され,0%が指定されたものとして動作します。このため,事前割り当てページを含むセグメント内の空きページの比率は,指定値より小さい値になることがあります。
-
SDBデータベースを操作するAPIで事前割り当てページにレコードを格納する際,PCTFREE有効化オプションの指定によって,ページ内に未使用領域を作成することはできません。PCTFREE有効化オプションを適用すると,SDBデータベースを操作するAPIによるレコードの格納がエラーになります。
(c) 未使用領域へのレコード格納方法に関する留意事項
ページ内の未使用領域へのレコード格納方法は,レコード格納契機によって異なります。レコード格納契機ごとの差異を次の表に示します。
レコード格納契機 |
ページ内の未使用領域 |
|||
---|---|---|---|---|
レコード格納前 |
レコード格納後 |
|||
指定比率以上の未使用領域あり |
指定比率以上の未使用領域なし |
指定比率以上の未使用領域あり |
指定比率以上の未使用領域なし |
|
HiRDB/SDデータベース作成ユティリティ(pdsdblod)の実行時 |
○ |
× |
− |
− |
SDBデータベースを操作するAPIによるレコードの格納時 |
− |
− |
○ |
× |
DMLによるレコードの格納時 |
− |
− |
○※ |
○※ |
HiRDB/SDデータベース作成ユティリティ(pdsdblod)実行時には,レコード格納前のページに指定した比率の未使用領域が存在すれば,そのページにレコードを格納するため,指定した比率で未使用領域が作成されないことがあります。
(5) データロード後のレコード格納に備えて空き領域を確保する場合の見積もり例
(a) 基本的な考え方
-
事前割り当てページに格納するファミリについては,除外して考えます。事前割り当てページに格納するファミリの容量の見積もりについては,「3.5.5(3) 事前割り当てページ数または事前割り当てサブページ数の算出【4V FMB】」を参照してください。
-
作成するSDBデータベースの特性を考慮して,平均的なファミリを想定します。データロード時に作成した空き領域に,データロード後に格納するレコードがすべて格納できる状態とします。この状態を次の図に示します。
図3‒10 見積もりで想定するレコード格納状態
(b) 見積もりの進め方
作成するSDBデータベースの特性から平均的なファミリを想定して,次の表に示す項目を見積もってください。レコード長の見積もりについては,「3.5.5(1) レコード長の算出」を参照してください。
見積もり時の留意事項を次に示します。
-
4V AFMのSDBデータベースで,SDBデータベース定義のOCCURRENCE NUMBER句の指定値が1以上のレコードについては,ページ切り替え指定が'O'指定の仮想ルートレコードとして見積もってください。
-
SD FMBのSDBデータベースの場合は,ページ切り替えの指定はなしとして見積もってください。
表3‒9 見積もりに必要な項目 項番
項目
レコードの格納契機
ページ切り替え指定
空き領域の種別
見積もり式で使用する変数
備考
1
レコードを格納するRDエリアのページ長
−
−
−
b
−
2
レコード長
−
−
−
L
レコード型ごとに見積もります。
3
レコード件数
データロード時に格納するレコード件数
'O'指定
−
t1
平均的なファミリまたは事前割り当てページに格納するファミリについて,レコード型ごとに見積もります。
4
'C'指定
−
c1
5
指定なし
−
n1
6
データロード後に格納するレコード件数
'O'指定
−
t2
7
'C'指定
−
c2
8
指定なし
ページ内の未使用領域を使用するレコード件数
u2
9
セグメント内の空きページを使用するレコード件数
s2
「表3-9 見積もりに必要な項目」の「空き領域の種別」で,データロード後に格納するレコードをページ内の未使用領域,およびセグメント内の空きページのどちらに見積もるかは,次の表に従って決定してください。
SDBデータベース定義のSET句下の指定 |
格納するレコードの特性 |
見積もり対象とする空き領域の種別 |
---|---|---|
ORDER句にSORTED DUPLICATES PROHIBITED指定 |
格納するレコードが持つユーザキーの中間のキーを持つレコード |
ページ内の未使用領域 |
最大のユーザキーを持つレコード |
セグメント内の空きページ |
|
ORDER句にLAST指定 |
− |
セグメント内の空きページ |
「表3-9 見積もりに必要な項目」に従った見積もり項目のレコード長,およびレコード件数について,見積もり例を次の表に示します。
レコード型 |
レコード長(バイト) |
データロード時に格納するレコード |
データロード後に格納するレコード |
|||||
---|---|---|---|---|---|---|---|---|
'O'指定(件数) |
'C'指定(件数) |
指定なし(件数) |
'O'指定(件数) |
'C'指定(件数) |
指定なし |
|||
ページ内の未使用領域を使用するレコード(件数) |
セグメント内の空きページを使用するレコード(件数) |
|||||||
REC1(親) |
40 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
REC2(子) |
100 |
5 |
5 |
40 |
1 |
1 |
8 |
8 |
REC3(孫) |
200 |
0 |
0 |
150 |
0 |
0 |
40 |
20 |
「表3-11 レコード長,およびレコード件数の見積もり例」に従った格納状態のイメージを次の図に示します。
(c) 注意事項
セグメント内の空きページの比率には,50%を超える値を指定できないため,想定したファミリの格納イメージで,セグメント内の空きページの比率が50%を超える場合には,データロード後に格納するレコードの一部をページ内の未使用領域を使用するものとして見積もるようにしてください。ただし,ページ切り替え('O'指定,'C'指定)をするレコードは格納時にページ内の未使用領域を使用しないため,ページ内の未使用領域を使用するものとして見積もることはできません。
(d) 見積もり式の前提
見積もり式では,「表3-9 見積もりに必要な項目」の「見積もり式で使用する変数」で示した変数を使用します。また,「表3-9 見積もりに必要な項目」の項番2〜9については,レコード型ごとに見積もるため,ファミリ単位の件数の場合には,すべてのレコード型について総和が必要です。すべてのレコード型についての総和は,総和記号を使って次のように表記します。
(e) ページ内の未使用領域の比率の見積もり
ページ内の未使用領域の比率の見積もりで,すべてのレコードに対してページ切り替えを指定する場合には,見積もり値を0としてください。
ページ内の未使用領域の比率を見積もる場合,「表3-9 見積もりに必要な項目」の項番1,2,5,8を使用します。項番5,8については,次の式でレコード型が使用する総領域長を計算してください。
また,項番5,8を使用して,次のように平均領域長を計算してください。
上記で計算した結果を基に,次のR,A,Bを計算してください。
R:ページ内の領域に対するデータロード時の未使用領域の比率
A:データロード時とデータロード後の総レコード長に対する,データロード時の総レコード長の比率
- B:ページ内の領域に対するデータロード時の使用可能領域の比率
ページ内の未使用領域の比率を次の式で見積もってください。
(f) ページ内の未使用領域の比率の見積もり例
「表3-11 レコード長,およびレコード件数の見積もり例」に示す値を基に,ページ内の未使用領域の比率を見積もった例を次に示します。この例では,レコードを格納するRDエリアのページ長を4,096バイトとして計算します。
(g) セグメント内の空きページの比率の見積もり
セグメント内の空きページの比率を見積もる場合,「表3-9 見積もりに必要な項目」の項番1〜7および9を使用して計算してください。ページ内の未使用領域の比率をCとすると,セグメント内の空きページの比率は,ファミリが使用するページ数と,データロード後に格納するレコードが使用するページ数の比率として見積もります。
項番5,9について,次に示す式を使用してレコード型が使用する総領域長を計算します。
また,それぞれについて,次のように平均領域長を計算してください。
次の計算式に従って,平均的なファミリが使用するページ数を計算してください。
次の計算式に従って,データロード後に格納するレコードが使用する空きページ数を計算してください。
以上を基に,セグメント内の空きページの比率を計算してください。
(h) セグメント内の空きページの比率の見積もり例
「表3-11 レコード長,およびレコード件数の見積もり例」の表に示す値を基に見積もり計算の例を次に示します。レコードを格納するRDエリアのページ長を4,096バイト,ページ内の未使用領域の比率を24%として計算します。
(6) ページに格納するレコード件数を制限する場合のページ内の未使用領域の比率の見積もり【4V FMB,4V AFM】
(a) 見積もりの前提
-
事前割り当てページに格納するファミリについては,ページ内の未使用領域を確保しないで詰めて格納していくため,対象外とします。
-
4V AFMのSDBデータベースでOCCURRENCE NUMBER句の指定が1以上の場合を前提にします。4V FMBのSDBデータベースの場合,または4V AFMのSDBデータベースでOCCURRENCE NUMBER句の指定が0の場合は,レコード件数の制限による同時実行性の向上に効果がないため,対象外とします。
-
SD FMBのSDBデータベースの場合,ページに格納するレコード件数を制限できないため,対象外とします。
(b) 見積もりの進め方
作成するデータベースの中で,格納件数を制限する対象のレコード型を,次の表に従って決定してください。
項番 |
親子集合の定義数 |
格納件数の制限対象とするレコード型 |
備考 |
---|---|---|---|
1 |
1 |
子レコードのレコード型 |
− |
2 |
2以上 |
同時実行性が最も要求される子レコードのレコード型 |
SDBデータベースを操作するAPIによるレコード格納時,対象外のレコード型に対してページ内の未使用領域を作成したくない場合は,制限対象のレコード型のレコード格納時だけPCTFREE句の指定を有効にしてください。 なお,HiRDB/SDデータベース作成ユティリティ(pdsdblod)のrecfreeオペランドでは,レコード型ごとにページ内の未使用領域の比率を設定することはできません。 |
ページに格納するレコード件数を制限する場合のページ内の未使用領域の比率は次の計算式で見積もってください。レコード長の見積もりについては,「3.5.5(1) レコード長の算出」を参照してください。
なお,見積もり式では,Nは255以下にする必要があります。また,計算結果が負となる場合は,ページにN件のレコードを格納できないため,レコード件数を見直してください。
(c) 留意事項
-
レコードを格納するRDエリアのページ内には,HiRDB/SDがシステムで使用する制御情報が格納されています。レコードの格納,または削除による制御情報長の変化や,レコードの格納状況によっては,見積もったレコード件数よりも少ないレコードしか格納できない場合があります。
-
レコード長の異なる複数のレコード型をページに格納する場合,レコードの格納状況によって,見積もったレコード件数より少ないレコードしか格納できなかったり,逆に多くのレコードが格納できたりすることがあります。
-
SDBデータベースを操作するAPI実行時,またはHiRDB/SDデータベース作成ユティリティ(pdsdblod)実行時では,見積もりの計算式が異なります。そのため,同じレコード件数に制限したい場合は,それぞれで見積もる必要があります。
見積もり結果が異なる場合は,SDBデータベース格納定義のPCTFREE句,およびHiRDB/SDデータベース作成ユティリティ(pdsdblod)のenvironment文のrecfreeオペランドにそれぞれの見積もり結果を指定してください。
(d) 見積もりの計算例
レコード長が120バイト,レコードを格納するRDエリアのページ長を4,096バイトとして,SDBデータベースを操作するAPI実行時にページに格納するレコード件数を20件としたい場合の見積もりの計算例を次に示します。