14.1.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:グループ化する列の列長(表「グループ化するときの列の長さ及び集合関数の演算領域の長さ」を参照して求めてください)
d:集合関数の演算領域長(表「グループ化するときの列の長さ及び集合関数の演算領域の長さ」を参照して求めてください)
- e:32ビットモードの場合:MAX(4×N×24 ,16408)
-
64ビットモードの場合:MAX(8×N×40 ,32808)
- N:クライアント環境定義のPDAGGRオペランドの値
-
表14‒4 グループ化するときの列の長さ及び集合関数の演算領域の長さ 列のデータ型
グループ化する列の列長
集合関数の演算領域長※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 SQLリファレンス」の「集合関数」を参照してください。
(2) 列ごとのデータ抑制指定時に必要なメモリ所要量の求め方
列ごとのデータ抑制を指定(CREATE TABLEの列定義にSUPPRESSを指定)した表に対してアクセスするときに使用するメモリサイズは,次に示す計算式で求められます。
- 計算式
a+128 (単位:バイト)
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 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 UAP開発ガイド」を参照してください。
(4) スナップショット方式指定時に必要なメモリ所要量の求め方
pd_pageaccess_modeオペランドを省略した場合又はSNAPSHOTを指定した場合,スナップショット方式を適用するSQL文を実行すると,データベース検索時のページアクセス方式にスナップショット方式を使用します。このとき,表又はインデクスの格納RDエリアのページサイズに基づいて,動的に次に示すメモリサイズのプロセス固有領域を確保します。
- 計算式
a×2 (単位:バイト)
- a:検索対象の表又はインデクスが格納されているRDエリア中の最大ページ長
-
ただし,LOB用RDエリアは除きます。
(5) 先頭からn行の検索結果を取得する機能実行時に必要なメモリ所要量の求め方
先頭からn行の検索結果を取得する機能を使用すると,検索結果の先頭(又はユーザが指定した先頭からのオフセット行数分読み飛ばした位置)からn行取得できます。
LIMIT句に指定した行数が1以上で,(オフセット行数+LIMIT句に指定した行数)の値が32,767以下の場合,(オフセット行数+LIMIT句に指定した行数)以内に入り得る行をメモリに保持します。確保するプロセス固有領域のメモリサイズは,次に示す計算式で求められます。なお,(オフセット行数+LIMIT句に指定した行数)の値が32,768以上になる場合は作業表を作成するため,「作業表用ファイルの容量の見積もり」を参照してください。
- 計算式
{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番目の列データ長
-
列のデータ長については,表「データ長一覧」を参照し,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行の保持領域数は次の計算式で求められます。
1+UNION [ALL]句指定数
(6) 探索条件にインデクス型プラグイン専用関数を指定した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番目の列データ長
-
列のデータ長については,表「データ長一覧」を参照し,dに定義長を代入して求めてください。
ただし,BLOBデータ,又は定義長が256バイト以上の文字データ(各国・混在文字データも含む)で,下記に属さない列の場合は12バイトになります。
-
結合条件中に指定する列(結合列)
-
DISTINCT句指定の選択式に指定する列
-
限定述語の副問合せ中の選択式に指定する列
-
IN述語の副問合せ中の選択式に指定する列
-
UNION [ALL],又はEXCEPT [ALL]によって集合演算対象となっている問合せ指定中の選択式
-
ORDER BY句に指定した列
また,FOR UPDATE句を指定した場合に,mに加算した1に対応するAiは12バイトとします。
-
(7) 拡張SQLエラー情報出力機能使用時に必要なメモリ所要量の求め方
拡張SQLエラー情報出力機能を使用した場合,次のときにプロセス固有領域を確保します。
(a) OPEN文実行時
- 計算式
●32ビットモードの場合 (16+16×m)+a ●64ビットモードの場合 (24+24×m)+a (単位:バイト)
- a:?パラメタ又は埋込み変数のデータ長の合計
-
m
a=Σ(ai)
i=1
m:SQL文中の?パラメタ又は埋込み変数の数
- ai:i番目の?パラメタ又は埋込み変数のデータ長
-
埋込み変数又は?パラメタのデータ長を次の表に示します。
表14‒5 埋込み変数又は?パラメタのデータ長 データ型
列長(標識変数なし)
列長(標識変数あり,埋込み変数又は?パラメタ)
INTEGER
4
6
SMALLINT
2
4
DECIMAL(p,s)
↑(p+1)÷2↑
↑(p+5)÷2↑
FLOAT
8
10
SMALLFLT
4
6
INTERVAL YEAR TO DAY
5
7
INTERVAL HOUR TO SECOND
4
6
CHAR(n)
n
n+2
VARCHAR(n)
n+2
n+4
NCHAR(n)
2×n
2×n+2
NVARCHAR(n)
2×n+2
2×n+4
MCHAR(n)
n
n+2
MVARCHAR(n)
n+2
n+4
DATE
4
6
TIME
3
5
BLOB(n)
n+4
n+8
TIMESTAMP(p)
7+(p÷2)
9+(p÷2)
BINARY(n)
n+4
n+8
(b) 定義系SQLのPREPARE文実行時
- 計算式
SQL文長+20 (単位:バイト)
(8) 部分構造インデクスの定義,又は部分構造インデクスを定義した表の更新時に必要なメモリ所要量の求め方
(a) 部分構造インデクスの定義時
定義系SQLのCREATE INDEXで部分構造インデクスを定義する場合に確保するプロセス固有領域は,次に示す計算式で求められます。
- 計算式
(インデクスキー長※×100+64) (単位:バイト)
- 注※
-
表に定義する部分構造インデクスの最大定義長です。
(b) 部分構造インデクスを定義した表の更新時
操作系SQLのINSERT,UPDATE,又はDELETEで部分構造インデクスを定義した表を更新する場合に確保するプロセス固有領域は,次に示す計算式で求められます。
- 計算式
(インデクスキー長※1×100+64+128)+Σ(インデクスキー長+128)※2 (単位:バイト)
- 注※1
-
表に定義している部分構造インデクスの最大定義長です。
- 注※2
-
USING UNIQUE TAG指定の部分構造インデクス数です。
(9) 圧縮列に対して操作系SQLを実行する場合に必要なメモリ所要量の求め方
SQL実行時,データの格納,及び抽出対象に圧縮列が含まれる場合,次に示すメモリサイズのプロセス固有領域を確保します。
- 計算式
MIN(圧縮分割サイズ,圧縮列の定義長)※×C+L (単位:バイト)
- C:次に示すどれかの条件に該当する場合は2。該当しない場合は1。
-
-
SUBSTR関数を使用している
-
POSITION関数を使用している
-
後方削除更新をしている
-
- L:SQLの実行対象となる圧縮表が格納されているRDエリアのページ長
-
複数のRDエリアが対象になる場合は,最大のページ長で計算する。
- 注※
-
SQLの実行対象となる全圧縮列の中で最大になる値で計算します。