16.2.6 SQL実行時に必要なメモリ所要量の計算式
(1) グループ分け高速化機能実行時に必要なメモリ所要量の求め方
クライアント環境定義でPDSQLOPTLVLオペランドを指定するか,HiRDBシステム定義でpd_optimize_levelオペランドを指定(又は省略)した場合,適用条件を満たすSQLを実行すると,グループ分け高速化機能が働きます。このとき,HiRDBはクライアント環境定義のPDAGGRオペランドの値に基づいてプロセス固有メモリを確保します。確保するメモリサイズを次に示します。
グループ分け高速化機能実行時に必要なメモリ所要量は,バックエンドサーバを定義するサーバマシンについてだけ計算してください。
- 計算式
e+↑d÷4↑×4+↑(17+4×a+4×b+c+d)÷4↑×4×(N+1) (単位:バイト) |
- a:グループ化する列の数
- b:集合関数の演算数
- COUNT,SUM,MAX,MINは一つにつき1で換算します。
- AVG(COUNT),AVG(SUM)は一つにつき2で換算します。
- c:グループ化する列の列長(表16-11を参照して求めてください)
- d:集合関数の演算領域長(表16-11を参照して求めてください)
- e:32ビットモードの場合:MAX(4×N×24 ,16408)
- 64ビットモードの場合:MAX(8×N×40 ,32808)
- N:クライアント環境定義のPDAGGRオペランドの値
表16-11 グループ化するときの列の長さ及び集合関数の演算領域の長さ
列のデータ型 | グループ化する列の列長 | 集合関数の演算領域長※1 |
---|
INTEGER | 4 | 6 |
SMALLINT | 2 | 4※2 |
DECIMAL(p,s) | ↑(p+1)÷2↑ | ↑(p+7)÷2↑※3 |
FLOAT | 8 | 10 |
SMALLFLT | 4 | 6 |
INTERVAL YEAR TO DAY | 5 | 8 |
INTERVAL HOUR TO SECOND | 4 | 6 |
CHAR(n) | n | n+3 |
VARCHAR(n) | n+2 | n+5 |
NCHAR(n) | 2×n | 2×n+2 |
NVARCHAR(n) | 2×n+2 | 2×n+4 |
MCHAR(n) | n | n+3 |
MVARCHAR(n) | n+2 | n+5 |
DATE | 4 | 6 |
TIME | 3 | 6 |
BLOB(n) | - | - |
BINARY(n) | n+2 | n+5 |
- (凡例)-:該当しません。
- 注※1
- 集合関数がCOUNTの場合,集合関数演算領域長はデータ型にかかわらず6になります。
- 注※2
- 集合関数がAVG,SUMの場合,集合関数演算領域長は6になります。
- 注※3
- 集合関数がAVG,SUMの場合,集合関数演算領域長は次の値になります。
- 集合関数の値の型がDECIMAL型で精度が29けたのとき:18
- 集合関数の値の型がDECIMAL型で精度が38けたのとき:23
- 集合関数の値のデータ型の規則については,マニュアル「HiRDB Version 8 SQLリファレンス」の「集合関数」を参照してください。
(2) 列ごとのデータ抑制指定時に必要なメモリ所要量の求め方
列ごとのデータ抑制を指定(CREATE TABLEの列定義にSUPPRESSを指定)した表に対してアクセスするときに使用するメモリサイズは,次に示す計算式で求められます。
- 計算式
- a:表中の列ごとのデータ抑制が指定されている列の定義長の合計値
(3) ハッシュジョイン及び副問合せのハッシュ実行時に必要なメモリ所要量の求め方
クライアント環境定義でPDADDITIONALOPTLVLオペランドを指定するか,HiRDBシステム定義でpd_additional_optimize_levelオペランドを指定すると,SQL拡張最適化オプションが働きます。このSQL拡張最適化オプションで,「ハッシュジョイン,副問合せのハッシュ実行の適用(APPLY_HASH_JOIN)」を指定した場合,表の結合又は副問合せのSQLを実行すると,次に示すメモリサイズのプロセス固有領域を確保します。
- 計算式
●32ビットモードの場合 a Σ(13×1024+6×1024×b+c) i=1 ●64ビットモードの場合 a Σ(13×1024+7×1024×b+c) i=1 (単位:バイト) |
- a:SELECT文のハッシュジョイン最大数
- SELECT文のハッシュジョイン最大数については,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。
- b:ハッシュ表行数によって適用されるハッシュジョイン処理を求めて,次に示す表から代入する値を決定してください。
ハッシュ表行数の目安 | 適用されるハッシュジョイン処理 | bの値 |
---|
1500以内 | 一括ハッシュジョイン | 0.5 |
1500×(バケット分割数÷3)以内 | バケット分割 ハッシュジョイン | 1レベルバケット分割 | 1 |
1500×(バケット分割数÷3)2以内 | 2レベルバケット分割 | 2 |
1500×(バケット分割数÷3)2を超える場合 | 3レベルバケット分割 | 3 |
- ハッシュ表行数:ジョインの場合はジョインの内表件数です。副問合せの場合は探索条件中の外への参照列を含む述語を除いた副問合せ探索件数です。
- バケット分割数:MIN{↓(ハッシュ表サイズ÷2)÷ハッシュ表ページ長↓,64}
- ハッシュ表サイズ:HiRDBシステム定義のpd_hash_table_sizeオペランド,又はクライアント環境変数のPDHASHTBLSIZEオペランドで指定した値です。
- ハッシュ表ページ長:次に示す表からc(ハッシュ表最大行長)に対応するハッシュ表ページ長を選択してください。
ハッシュ表最大行長 | ハッシュ表ページ長(単位:バイト) |
---|
0~1012 | 4096 |
1013~2036 | 8192 |
2037~4084 | 16384 |
4085~16360 | 32768 |
16361~32720 | ↑(ハッシュ表最大行長+48)÷2048↑×2048 |
- c:ハッシュ表最大行長
- ハッシュ表最大行長については,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。
(4) 外部表検索時に必要なメモリ所要量の求め方
外部表検索時(HiRDB External Data Access機能使用時)に必要なメモリ所要量の計算式を次に示します。アクセスパス表示ユティリティ(pdvwoptコマンド)で外部表を検索するSQL文を確認できます。なお,外部表に対するSQL実行時に使用するメモリの最大サイズは2,147,483,647バイトとなります。
- 計算式
a+16+16×b+c 外部表を検索するSQL文中に埋込み変数又は?パラメタがある場合に加算します。 +16+16×e+d (単位:バイト) |
- a:外部表を検索するSQL文の長さ
- b:検索対象となる外部表の列数
- c:<検索対象の外部サーバの,外部サーバ情報定義にpd_hb_ary_fec_numオペランドがある場合>
- pd_hb_ary_fec_numオペランドを指定しているとき
検索対象となる外部表の列長の総和(表16-5を参照)×pd_hb_ary_fec_numオペランドの値
- pd_hb_ary_fec_numオペランドを指定していないとき
MAX{検索対象となる外部表の列長の総和(表16-5を参照),pd_sql_send_buff_sizeの値×2048}
- <検索対象の外部サーバの,外部サーバ情報定義にpd_hb_ary_fec_numオペランドがない場合>
- 外部表の列長の総和(表16-5を参照を参照)
- d:外部表を検索するSQL文中の埋込み変数又は?パラメタの列長の総和(表16-5を参照)
- e:外部表を検索するSQL文中の埋込み変数又は?パラメタ数
(5) スナップショット方式指定時に必要なメモリ所要量の求め方
pd_pageaccess_modeオペランドを省略した場合又はSNAPSHOTを指定した場合,スナップショット方式を適用するSQL文を実行すると,データベース検索時のページアクセス方式にスナップショット方式を使用します。このとき,表又はインデクスの格納RDエリアのページサイズに基づいて,動的に次に示すメモリサイズのプロセス固有領域を確保します。
- 計算式
- a:検索対象の表又はインデクスが格納されているRDエリア中の最大ページ長。
- ただし,LOB用RDエリアは除きます。
(6) 先頭からn行の検索結果を取得する機能実行時に必要なメモリ所要量の求め方
先頭からn行の検索結果を取得する機能を使用すると,検索結果の先頭(又はユーザが指定した先頭からのオフセット行数分読み飛ばした位置)からn行取得できます。
LIMIT句に指定した行数が1以上で,(オフセット行数+LIMIT句に指定した行数)の値が32,767以下の場合,(オフセット行数+LIMIT句に指定した行数)以内に入り得る行をメモリに保持します。確保するプロセス固有領域のメモリサイズは,次に示す計算式で求められます。なお,(オフセット行数+LIMIT句に指定した行数)の値が32,768以上になる場合は作業表を作成するため,「19. 作業表用ファイルの容量の見積もり」を参照してください。
- 計算式
{100+(a+2)×(オフセット行数+LIMIT句に指定した行数)}×b (単位:バイト) |
- a:行長
- 行長は32,720バイト以下でなければなりません。行長は次の計算式で求められます。
m Σ(Ai)+2×m+4+c i=1 (単位:バイト) |
- m:選択式,GROUP BY句,又はORDER BY句に指定した列数
- FOR UPDATE句を指定した場合は1を加算してください。ただし,選択式にROWを指定している場合は表の全列数になります。
- Ai:先頭n行保持領域に格納する行のi番目の列データ長
- 列のデータ長については,「表17-1 データ長一覧」を参照し,dに定義長を代入して求めてください。
- ただし,BLOBデータ,定義長が256バイト以上の文字データ(各国・混在文字データも含む),BINARYデータのうち,下記に属さない列の場合は12バイトになります。
- DISTINCT句指定の選択式に指定する列
- UNION [ALL]によって集合演算対象となっている問合せ指定中の選択式
- ORDER BY句に指定した列
- また,FOR UPDATE句を指定した場合に,mに加算した1に対応するAiは12バイトとします。
- c:8
- ただし,次の場合は0になります。
- 検索対象の表にEXモードで排他が掛かっている場合
- WITHOUT LOCKを指定した場合
- グループ分け高速化機能を指定した場合
- 複数の表を結合する場合
- b:先頭n行保持領域数
- 先頭n行保持領域数は次の計算式で求められます。
(7) 探索条件にインデクス型プラグイン専用関数を指定したSQL文実行時に必要なメモリ所要量の求め方
探索条件にインデクス型プラグイン専用関数を指定したSQL文の実行時に確保するプロセス固有領域のメモリサイズは,次に示す計算式で求められます。
- 計算式
a×500+(20+6)×800+16 (単位:バイト) |
- a:行長。行長は次の計算式で求められます。
m Σ(Ai)+4×(m+2)+12+4+8 i=1 (単位:バイト) |
- m:選択式,結合条件,GROUP BY句,又はORDER BY句に指定した列数
- FOR UPDATE句を指定した場合は1を加算してください。ただし,選択式にROWを指定している場合は表の全列数になります。
- Ai:取り出す行のi番目の列データ長
- 列のデータ長については,「表17-1 データ長一覧」を参照し,dに定義長を代入して求めてください。
- ただし,BLOBデータ,又は定義長が256バイト以上の文字データ(各国・混在文字データも含む)で,下記に属さない列の場合は12バイトになります。
- 結合条件中に指定する列(結合列)
- DISTINCT句指定の選択式に指定する列
- 限定述語の副問合せ中の選択式に指定する列
- IN述語の副問合せ中の選択式に指定する列
- UNION [ALL],又はEXCEPT [ALL]によって集合演算対象となっている問合せ指定中の選択式
- ORDER BY句に指定した列
- また,FOR UPDATE句を指定した場合に,mに加算した1に対応するAiは12バイトとします。
(8) 拡張SQLエラー情報出力機能使用時に必要なメモリ所要量の求め方
拡張SQLエラー情報出力機能を使用した場合,次のときにプロセス固有領域を確保します。
(a) OPEN文実行時
- 計算式
●32ビットモードの場合 (16+16×m)+a ●64ビットモードの場合 (24+24×m)+a (単位:バイト) |
- a:?パラメタ又は埋込み変数のデータ長の合計
- m
- a=Σ(ai)
- i=1
- m:SQL文中の?パラメタ又は埋込み変数の数
- ai:i番目の?パラメタ又は埋込み変数のデータ長
- データ長については,表16-5を参照して算出します。
(b) 定義系SQLのPREPARE文実行時
- 計算式
(9) 部分構造インデクスの定義,又は部分構造インデクスを定義した表の更新時に必要なメモリ所要量の求め方
(a) 部分構造インデクスの定義時
定義系SQLのCREATE INDEXで部分構造インデクスを定義する場合に確保するプロセス固有領域は,次に示す計算式で求められます。
- 計算式
(インデクスキー長※×100+64) (単位:バイト) |
- 注※
- 表に定義する部分構造インデクスの最大定義長です。
(b) 部分構造インデクスを定義した表の更新時
操作系SQLのINSERT,UPDATE,又はDELETEで部分構造インデクスを定義した表を更新する場合に確保するプロセス固有領域は,次に示す計算式で求められます。
- 計算式
(インデクスキー長※1×100+64+128)+Σ(インデクスキー長+128)※2 (単位:バイト) |
- 注※1
- 表に定義している部分構造インデクスの最大定義長です。
- 注※2
- USING UNIQUE TAG指定の部分構造インデクス数です。