バッチジョブのジョブリポジトリとして使用するデータベースに必要なディスク容量の見積もりについて説明します。必要なディスク容量はテーブル容量にインデックス容量を加算したものです。
見積もりにあたり、運用の見積もりに応じて以下の10件のユーザ変数を決定する必要があります。それぞれの変数名はアルファベットでラベル付けしており、後の計算で使用します。
ジョブ実行数に関連した変数
No | 項目 | 変数名 |
---|---|---|
1 | ジョブインスタンス数 | J |
2 | 1インスタンスあたりのジョブ実行数 | E |
ジョブ定義に関連した変数(想定する平均の数)
No | 項目 | 変数名 |
---|---|---|
3 | 1ジョブ定義に含まれるステップ数 | S |
4 | 1ジョブ定義に含まれるパーティションの数 | P |
5 | 1ジョブ定義に含まれるスプリット内フローの数 | F |
6 | 1ジョブ定義に含まれるチャンクステップの数(チャンクステップがパーティション化されている場合はそのパーティション数を加算する)(注) | C |
(注) 例えば通常のチャンクステップが1つ、5パーティションで動作するチャンクが1つあれば、1+5=6とします。
バッチアプリケーション内のシリアライズ化オブジェクトの大きさに関連した変数(想定する平均サイズ、単位はバイト)
No | 項目 | 変数名 |
---|---|---|
7 | JobOperator#start()の第二引数に渡すParameterオブジェクト | Sp |
8 | StepContext#setPersistentUserData()に渡すユーザーパーシステントデータオブジェクト | Su |
9 | ItemReaderやItemWriterで使用するチェックポイントオブジェクト | Sc |
10 | ジョブXMLのサイズ | Sx |
バッチジョブの管理のため、以下のテーブルを使用します。個々のテーブルごとに必要サイズを見積もり、合計した値をテーブルのディスク使用量とします。
テーブル名 | 使用目的(格納する情報) |
---|---|
JOBINSTANCEDATA | ジョブインスタンス情報 |
EXECUTIONINSTANCEDATA | ジョブ実行情報 |
STEPEXECUTIONINSTANCEDATA | ステップ実行情報 |
JOBSTATUS | 実行しているジョブインスタンスに関する状態 |
STEPSTATUS | 実行しているステップに関する情報 |
CHECKPOINTDATA | チャンクで使用するチェックポイント情報 |
見積もりは以下の手順で行います。
テーブルで使用するレコードサイズを算出
1ブロックに格納可能なレコード数を算出
テーブルの想定レコード数を算出
必要ブロック数を算出
シリアライズ化オブジェクトのサイズを算出
テーブル必要量の算出
見積もりにあたり、以下の注意事項があります。
ブロックサイズ等の数値は、使用するデータベース製品や設定により変わる場合があるため、運用環境で使用する値に読み替えてください。
可変長データのカラムには、最大長のデータが格納されているものとして見積もりしています。
以降の説明では、単位としてバイトを使用します。
各テーブルに格納されるレコード(行)のサイズを決定します。
テーブル | 変数名 | Oracle | SQL Server | Symfoware (Postgres) |
---|---|---|---|---|
JOBINSTANCEDATA | D1 | 平均データサイズ(注1) | 平均データサイズ(注2) | 平均データサイズ(注2) |
EXECUTIONINSTANCEDATA | D2 | 331 | 313 | 313 |
STEPEXECUTIONINSTANCEDATA | D3 | 493 | 457 | 457 |
JOBSTATUS | D4 | 11 | 8 | 8 |
STEPSTATUS | D5 | 11 | 8 | 8 |
CHECKPOINTDATA | D6 | 155 | 155 | 155 |
(注1) Oracleの場合: (239+263×P+389×F)÷(1+P+F)
(注2) SQL Server、Symfoware(Postgres)の場合: (236+260×P+386×F)÷(1+P+F)
計算結果の小数点以下は切り上げて使用してください。
1ブロックに格納可能なレコード(行)数を決定します。小数点以下は切り捨ててください。Baはテーブルブロック内のレコード格納可能な領域のサイズで、各データベースおよび設定により変わる場合があります。このため適宜値を読み替えて使用してください(デフォルトではOracle=7291、SQL Server=8096、Symfoware(Postgres)=8168)。
テーブル | 変数名 | 計算式 |
---|---|---|
JOBINSTANCEDATA | P1 | Ba÷D1 |
EXECUTIONINSTANCEDATA | P2 | Ba÷D3 |
STEPEXECUTIONINSTANCEDATA | P3 | Ba÷D4 |
JOBSTATUS | P4 | Ba÷D5 |
STEPSTATUS | P5 | Ba÷D6 |
CHECKPOINTDATA | P6 | Ba÷D7 |
最初に想定した変数を用いて、各テーブルに何レコード(行)登録されるかを決定します。
テーブル | 変数名 | 計算式 |
---|---|---|
JOBINSTANCEDATA | R1 | J×(1+P+F) |
EXECUTIONINSTANCEDATA | R2 | R1×E |
STEPEXECUTIONINSTANCEDATA | R3 | J×(S+P) |
JOBSTATUS | R4 | R1 |
STEPSTATUS | R5 | R3 |
CHECKPOINTDATA | R6 | J×C×2 |
想定したレコード(行)数を格納するために何ブロック必要かを算出します。結果は小数点以下を切り上げて使用してください。
テーブル | 変数名 | 計算式 |
---|---|---|
JOBINSTANCEDATA | N1 | R1÷P1 |
EXECUTIONINSTANCEDATA | N2 | R2÷P2 |
STEPEXECUTIONINSTANCEDATA | N3 | R3÷P3 |
JOBSTATUS | N4 | R4÷P4 |
STEPSTATUS | N5 | R5÷P5 |
CHECKPOINTDATA | N6 | R6÷P6 |
バッチアプリケーション内で使用するオブジェクトについては、別途格納されていると仮定します。テーブルの見積もり結果に別途追加するため、テーブルごとの追加サイズをそれぞれ算出します。
テーブル | 変数名 | 計算式 |
---|---|---|
JOBINSTANCEDATA | L1 | 0 (無し) |
EXECUTIONINSTANCEDATA | L2 | Sp×R2 |
STEPEXECUTIONINSTANCEDATA | L3 | Su×R3 |
JOBSTATUS | L4 | (1219+Sx)×R4 |
STEPSTATUS | L5 | (949+Su)×R5 |
CHECKPOINTDATA | L6 | (345+Sc)×R6 |
これまでの結果を用い、テーブルに必要なディスク容量は以下のように計算できます。
必要ブロック数×ブロックサイズをすべてのテーブルについて合算し、シリアライズ化オブジェクトの合計サイズを加える
(N1+N2+N3+N4+N5+N6)×Bs + L1+L2+L3+L4+L5+L6 |
Bsはブロックのサイズで通常各データベースで8Kbytesですが、環境に応じて読み替えてください。
ここではインデックスの格納にはBツリーを使用しているものと仮定しています。さらに、通常リーフノードが使用量の大部分を占めるため、リーフノードのみの使用量を見積もることとします。
バッチジョブでは以下のインデックスを使用しています。それぞれ格納されるデータが異なるため、個々のインデックスごとに必要サイズを見積もり、それらを合計します。
プライマリキーに○印が付いているカラムは、データベースシステムにより自動でインデックスが作成されます。
No | テーブル名 | カラム名 | プライマリキー |
---|---|---|---|
1 | JOBINSTANCEDATA | jobinstanceid | ○ |
2 | EXECUTIONINSTANCEDATA | jobexecid | ○ |
3 | jobinstanceid | ||
4 | STEPEXECUTIONINSTANCEDATA | stepexecid | ○ |
5 | jobexecid | ||
6 | stepname | ||
7 | JOBSTATUS | id | ○ |
8 | STEPSTATUS | id | ○ |
9 | CHECKPOINTDATA | id |
見積もりは以下の手順で行います。基本的な考え方はテーブルの場合と同様です。
インデックステーブルで使用するレコードサイズを決定
1ブロックに格納可能なレコード数を算出
テーブルの想定レコード数を算出(テーブルの場合と同じ値)
必要なブロック数を算出
インデックス必要量の算出
インデックステーブルに格納されるレコードサイズを、各インデックスごとに決定します。
テーブル | カラム | 変数名 | Oracle | SQL Server | Symfowware (Postgres) |
---|---|---|---|---|---|
JOBINSTANCEDATA | jobinstanceid | D1’ | 26 | 17 | 20 |
EXECUTIONINSTANCEDATA | jobexecid | D2’ | 26 | 17 | 20 |
jobinstanceid | D3’ | 27 | 20 | 20 | |
STEPEXECUTIONINSTANCEDATA | stepexecid | D4’ | 26 | 17 | 20 |
jobexecid | D5’ | 27 | 20 | 20 | |
stepname | D6’ | 147 | 155 | 140 | |
JOBSTATUS | id | D7’ | 26 | 17 | 20 |
STEPSTATUS | id | D8’ | 26 | 17 | 20 |
CHECKPOINTDATA | id | D9’ | 174 | 184 | 173 |
1ブロックに格納可能なレコード(行)数を決定します。小数点以下は切り捨ててください。Ba'はインデックステーブルブロック内のレコード格納可能な領域のサイズで、各データベースおよび設定により変わる場合があります。このため適宜値を読み替えて使用してください(デフォルトではOracle=7243、SQL Server=8096、Symfoware(Postgres)=8152)。
テーブル | カラム | 変数名 | 計算式 |
---|---|---|---|
JOBINSTANCEDATA | jobinstanceid | P1' | Ba'÷D1 |
EXECUTIONINSTANCEDATA | jobexecid | P2' | Ba'÷D2 |
jobinstanceid | P3' | Ba'÷D3 | |
STEPEXECUTIONINSTANCEDATA | stepexecid | P4' | Ba'÷D4 |
jobexecid | P5' | Ba'÷D5 | |
stepname | P6' | Ba'÷D6 | |
JOBSTATUS | id | P7' | Ba'÷D7 |
STEPSTATUS | id | P8' | Ba'÷D8 |
CHECKPOINTDATA | id | P9' | Ba'÷D9 |
Ba'はブロック内のレコードを格納可能な領域のサイズで、各DBの設定により変わる場合がありますので適宜値を読み替えて使用してください。
最初に想定した変数から、各テーブルに何レコード(行)入るかを算出します。テーブルの容量計算で使用したものと同一の値です。
テーブル | 変数名 | 計算式 |
---|---|---|
JOBINSTANCEDATA | R1 | J×(1+P+F) |
EXECUTIONINSTANCEDATA | R2 | R1×E |
STEPEXECUTIONINSTANCEDATA | R3 | J×(S+P) |
JOBSTATUS | R4 | R1 |
STEPSTATUS | R5 | R3 |
CHECKPOINTDATA | R6 | J×C×2 |
想定レコード(行)数を格納するために何ブロック必要かを算出します。結果は小数点以下を切り上げて使用してください。
テーブル | カラム | 変数名 | 計算式 |
---|---|---|---|
JOBINSTANCEDATA | jobinstanceid | N1' | R1÷P1' |
EXECUTIONINSTANCEDATA | jobexecid | N2' | R2÷P2' |
jobinstanceid | N3' | R2÷P3' | |
STEPEXECUTIONINSTANCEDATA | stepexecid | N4' | R3÷P4' |
jobexecid | N5' | R3÷P5' | |
stepname | N6' | R3÷P6' | |
JOBSTATUS | id | N7' | R4÷P7' |
STEPSTATUS | id | N8' | R5÷P8' |
CHECKPOINTDATA | id | N9' | R6÷P9' |
これまでの結果を用い、インデックスに必要なディスク容量は以下のように計算できます。
必要ブロック数×ブロックサイズをすべてのインデックスについて合算し、安全係数を加味する
(N1'+N2'+N3'+N4'+N5'+N6'+N7'+N8'+N9')×Bs×安全係数 |
Bsはブロックのサイズで、通常各データベースで8Kbytesですが、環境に応じて読み替えてください。格納されるデータやその他の状況によってインデックスの使用率が変わってくるため、結果には安全係数(1.5以上)を掛けたものを使用してください。
テーブル使用量とインデックス使用量を加えたものをディスクの見積もり量としてください。
これらテーブルおよびインデックスの計算式は各可変長のカラムに最大長を設定した値を用いた概算のため、実際よりもおおむね大きな値が得られますが、実運用では充分に余裕をとった値を使用してください。
インデックスは運用に伴い肥大するため、適宜再構築等が必要になる場合があります。詳しくは各データベース製品のドキュメントを参照してください。
ここでは、以下の値を想定します。データベースはOracleを使用しているものとします。
No | 項目 | 変数名 | 想定値 |
---|---|---|---|
1 | 実行するジョブインスタンス数 | J | 1000 |
2 | 1インスタンスあたりのジョブ実行数 | E | 1 |
3 | ジョブ定義中のステップ数 | S | 8 |
4 | ステップパーティション数 | P | 5 |
5 | スプリット内フロー数 | F | 5 |
6 | チャンクステップ+チャンクパーティション数 | C | 6 |
7 | パラメータオブジェクトのサイズ | Sp | 512 |
8 | ユーザパーシステントデータのサイズ | Su | 512 |
9 | チェックポイントデータのサイズ | Sc | 128 |
10 | ジョブXMLのサイズ | Sx | 4096 |
まず、JOBINSTANCEDATAのレコード平均サイズを求めます(小数点以下切り上げ)。
(239+263×P+389×F)÷(1+P+F) = 319 |
ここでブロック使用可能領域サイズ(Ba)を7291とします(Oracleのデフォルト値)。それらからブロックあたりの格納可能レコード数を求めます。結果について小数点以下は切り捨てます。
P1=7291÷319=22 P2=7291÷331=22 P3=7291÷493=14 P4=7291÷11=662 P5=7291÷11=662 P6=7291÷155=47 |
次に各テーブルに格納される行数を算出します。
R1=J×(1+P+F)=11000 R2=R1×E=11000 R3=J×(S+P)=13000 R4=R1=11000 R5=R3=13000 R6=J×C×2=12000 |
これらの結果から、各テーブルの必要ブロック数を算出します。結果について小数点以下は切り上げます。
N1=R1÷P1=11000÷22=500 N2=R2÷P2=11000÷22=500 N3=R3÷P3=13000÷14=929 N4=R4÷P4=11000÷662=17 N5=R5÷P5=13000÷662=20 N6=R6÷P6=12000÷47=256 |
次にシリアライズ化オブジェクトサイズを算出します。
L1=0 L2=Sp×R2=512×11000= 5632000 L3=Su×R3=512×13000= 6656000 L4=(1219+Sx)×R4=(1219+4096)×11000= 58465000 L5=(949+Su)×R5=(949+512)×13000 = 18993000 L6=(345+Sc)×R6=(345+128)×12000 = 5676000 |
これまでの結果から、以下のテーブル必要量が算出できます。ここではブロックサイズBsを8192として計算しています。
(N1+N2+N3+N4+N5+N6)×Bs + L1+L2+L3+L4+L5+L6 =(500+500+929+17+20+256)×8192 + 5632000+6656000+58465000+18993000+5676000 =113624624 |
次にインデックスの見積もりを行います。
以下のように、各インデックスについてブロックに格納可能なレコード数を見積もります。結果の小数点以下は切り捨てます。ここでBa'はOracleのインデックスブロック空き領域サイズのデフォルト値7243を使用しています。
P1'=7243÷26=278 P2'=7243÷26=278 P3'=7243÷27=268 P4'=7243÷26=278 P5'=7243÷27=268 P6'=7243÷147=49 P7'=7243÷26=278 P8'=7243÷26=278 P9'=7243÷174=41 |
次に必要ブロック数の見積もりを行います。想定行数(R1~R6)はテーブルの計算に使用したものと同一です。結果は小数点以下を切り上げて使用します。
N1'=R1÷P1'=11000÷278=40 N2'=R2÷P2'=11000÷278=40 N3'=R2÷P3'=11000÷268=42 N4'=R3÷P4'=13000÷278=47 N5'=R3÷P5'=13000÷268=49 N6'=R3÷P6'=13000÷49=266 N7'=R4÷P7'=11000÷278=40 N8'=R5÷P8'=13000÷278=47 N9'=R6÷P9'=12000÷41=293 |
ここまでの計算結果から、インデックス必要量を算出します。ここで、テーブルサイズBsは8192とします。また、安全係数を2とします。
(N1'+N2'+N3'+N4'+N5'+N6'+N7'+N8'+N9')×Bs×安全係数 = (40+40+42+47+49+266+40+47+293)×8192×2 = 14155776 |
ディスクの必要量は、テーブルとインデックスを合わせて
113624624+14155776 = 127780400 = 約122MB |
となります。ここで算出した値は概算であり実際は条件により異なる場合がありますので、使用する場合は充分な余裕を持った値としてください。