2.3.10 二次インデクス【4V FMB,4V AFM】
二次インデクスは,子レコードの検索や,子レコードを格納する際のレコード挿入位置の検索に使用するインデクスです。SDBデータベースの子レコードの構成要素(一連番号,またはユーザキー)に定義します。
子レコードの数が多い場合,参照するレコード数が増えるため,NEXTポインタまたはPRIORポインタに従って順アクセスすると検索性能が低下するおそれがあります。
このように,NEXTポインタまたはPRIORポインタを使用した順アクセスによる検索では検索性能に問題がある場合は,二次インデクスを使用すると,特定の子レコードに直接アクセスできるので,検索性能を向上できます。
二次インデクスはSDBデータベース格納定義のSECONDARY INDEX句で定義します。
二次インデクスを使用した場合の検索について,NEXTポインタまたはPRIORポインタを使用して順アクセスで検索する場合との違いを次の図に示します。
なお,ポインタを使用した順アクセスによる検索をポインタ検索といいます。
二次インデクスが定義された子レコードの検索時や格納時に,二次インデクスを使用するかどうかは,HiRDB/SDが決定します。二次インデクスが使用される検索条件については,「(2) 子レコード検索時の二次インデクスの使用有無」および「(3) 子レコード格納時の二次インデクスの使用有無」を参照してください。
なお,二次インデクスは,4V FMBまたは4V AFMのSDBデータベースの場合に定義できます。
- 〈この項の構成〉
(1) 二次インデクスの効果が期待できるケース
二次インデクスの効果が期待できるケースについて,子レコードの検索時および子レコードの格納時について,それぞれ説明します。
(a) 子レコードの検索時
子レコードの検索時に二次インデクスの効果が期待できるケースについて,SDBデータベース種別ごとに説明します。
- 4V FMBのSDBデータベースの場合
-
子レコード実現値の数が多く,NEXTポインタまたはPRIORポインタを使用した順アクセスによる検索では検索性能に問題がある場合は,二次インデクスを使用することで検索性能を向上できます。
- 4V AFMのSDBデータベースの場合
-
-
子レコード実現値の数が多く,NEXTポインタまたはPRIORポインタを使用した順アクセスによる検索では検索性能に問題がある場合は,二次インデクスを使用することで検索性能を向上できます。
-
NEXTポインタまたはPRIORポインタを使用して順アクセスで検索するときに,検索経路上にほかのトランザクションによって更新された子レコードを格納するページが存在すると,排他処理待ちが発生して同時実行性が低下することがあります。
更新を含むトランザクションと参照だけのトランザクションを同時に実行するような場合,二次インデクスを使用すると,特定の子レコードに直接アクセスできるので,排他処理待ちの発生を軽減できます。
-
(b) 子レコードの格納時
4V FMBのSDBデータベースの場合,子レコードの格納時にレコードの挿入位置を検索します。この検索に二次インデクスを使用することで,検索性能を向上できます。また,二次インデクスを使用すると,レコード数やレコードの格納位置に依存しないでレコード挿入位置を検索できるので,子レコード格納時の性能が一定になります。子レコード格納時のレコード挿入位置の検索については,「2.5.6(2) レコードの格納順序」を参照してください。
なお,二次インデクスが定義されていると,子レコード格納時にインデクスも更新されます。
(2) 子レコード検索時の二次インデクスの使用有無
子レコード検索時に二次インデクスを使用するかどうかは,親子集合位置指示子が指すレコードの一連番号またはユーザキーと,検索条件からHiRDB/SDが決定します。
なお,4V FMBのSDBデータベースでは,先頭のレコード(FIRSTポインタ)または最後のレコード(LASTポインタ)を基点とする検索の場合(SDBデータベースを操作するAPIの指示コードが'F'または'L'の場合)だけ二次インデクスが使用され,そのほかの検索では二次インデクスは使用されません(NEXTポインタまたはPRIORポインタを使用した順アクセスで検索されます)。
また,4V AFMのSDBデータベースでは,ユーザが指定した検索条件以外にも,検索範囲を絞り込める場合に,二次インデクスが使用されることがあります。
親子集合位置指示子については,「2.5.3 位置指示子」を参照してください。また,レコードの検索については,「2.5.4 レコードの検索」を参照してください。
レコード検索時の二次インデクスの使用有無を次の表に示します。
項番 |
SDBデータベース種別 |
指示コード |
検索条件※1 |
検索条件の有効/無効※3 |
二次インデクスの使用 |
---|---|---|---|---|---|
1 |
4V FMB |
F/L※2 |
あり |
有効 |
○ |
2 |
無効 |
× |
|||
3 |
なし |
− |
|||
4 |
上記以外 |
− |
− |
||
5 |
4V AFM |
F/L/N/P |
あり |
有効 |
○ |
6 |
無効 |
× |
|||
7 |
なし |
− |
|||
8 |
上記以外 |
− |
− |
次に示す(a)〜(c)のどれかに該当する場合,二次インデクスが使用されます。
(a) '='条件が指定されている場合
(b) 検索範囲に親子集合位置指示子が指すレコードが含まれない場合
(c) 検索範囲の基点を絞り込む条件が存在する場合
それぞれの検索条件の詳細について次に示します。
(a) '='条件が指定されている場合
二次インデクスのキーを構成する一連番号またはユーザキーに対して,'='条件が指定されている場合,二次インデクスが使用されます。
'='条件が指定されている場合に,二次インデクスが使用される例を次の図に示します。
(b) 検索範囲に親子集合位置指示子が指すレコードが含まれない場合
4V AFMのSDBデータベースの場合,NEXTポインタまたはPRIORポインタに従って順アクセスする際に(SDBデータベースを操作するAPIの指示コードが'N'または'P'の場合に),二次インデクスの構成要素の一連番号またはユーザキーに対する条件によって決定される検索範囲に,親子集合位置指示子が指すレコードが含まれていなければ,二次インデクスが使用されます。
検索範囲に親子集合位置指示子が指すレコードが含まれないときに,二次インデクスが使用される例を次の図に示します。
(c) 検索範囲の基点を絞り込む条件が存在する場合
先頭のレコード(FIRSTポインタ)または最後のレコード(LASTポインタ)を基点とする検索の場合(SDBデータベースを操作するAPIの指示コードが'F'または'L'の場合),二次インデクスの構成要素の一連番号またはユーザキーに対する検索範囲の基点を絞り込む条件が存在すると,二次インデクスが使用されます。
二次インデクスの構成要素の一連番号またはユーザキーに対する検索範囲の基点を絞り込む条件が存在する場合に,二次インデクスが使用される例を次の図に示します。
(3) 子レコード格納時の二次インデクスの使用有無
次に示す条件をすべて満たしている場合,子レコード格納時のレコード挿入位置の検索に,二次インデクスが使用されます。
-
レコード実現値を格納するレコード型にユーザキーが定義されている。
-
レコード実現値を格納するレコード型に,上記のユーザキーを構成要素とする二次インデクスが定義されている。
二次インデクスを使用したレコード挿入位置の検索について,二次インデクスを使用しない場合と比較した例を次に示します。
- 二次インデクスを使用したレコード挿入位置の検索の例
-
ユーザキーの値が3であるレコードを格納するとします。
上記の条件を満たしていれば,二次インデクスを使用してレコードの挿入位置(格納するレコードのPRIORポインタに接続されるレコード)が検索されます。二次インデクスを使用することで,検索範囲を絞り込むことができるため,効率的にレコードの挿入位置が検索されます。
なお,上記の条件を満たしていない場合は,挿入位置が見つかるまでNEXTポインタまたはPRIORポインタを使用して順アクセスします。このため,レコードの挿入位置によって検索性能に差が出ます。
図2‒23 二次インデクスを使用したレコード挿入位置の検索の例
(4) 二次インデクスの使用有無の確認
HiRDB/SDが二次インデクスを使用して検索したかどうかは,次の方法で確認できます。
-
UAP統計レポートの出力結果
-
SDBデータベースへのアクセス時にTP1/FSPで使用するインタフェースエリアの,エントリ部の二次インデクス使用フラグ
UAP統計レポートについては,「16.5.5 UAP統計レポート機能」を参照してください。また,SDBデータベースへのアクセス時に使用するインタフェースエリアについては,マニュアル「TP1/Financial Service Platform 使用の手引」の「SDBハンドラ機能」の「インタフェースエリア構造」を参照してください。
(5) 二次インデクスに関する留意事項
-
一般的に,NEXTポインタまたはPRIORポインタに従って順アクセスするよりも,二次インデクスを使用した方が検索性能は向上します。ただし,次のような場合には,二次インデクスを使用した方が検索性能が低下することがあります。
-
検索の開始地点(親レコードのFIRSTポインタまたはLASTポインタ)の近傍に目的のレコードが存在する場合
-
二次インデクス中に無効なキーが多く存在する場合
レコードを削除した場合,対応するインデクスキーは物理的には削除されないで,無効なキーとなります。そのため,無効となっているキーを含む範囲を検索すると,二次インデクスを使用した方が検索性能が低下することがあります。
-
-
二次インデクスが定義されている場合,レコードの格納や削除に伴ってインデクスが更新されます。そのため,レコードの格納や削除が頻繁に繰り返されると,更新性能が低下することがあります。