【実務・中級編】 PHDAM/PHIDAM (Partitioned HDAM/HIDAM) の定義 – 階層型DBMS

階層型DBMSの極意:PHDAM / PHIDAMによる大規模データ時代の物理スキーマ設計

こんにちは。チーフアーキテクトの私だ。
今日のコードレビューで、また「なんとなく」パーティションを切っただけの甘い物理スキーマを見かけた。リレーショナルデータベース(RDBMS)のシャスディングやパーティショニングの感覚で階層型DBMS(IMSなど)を触ると、確実にシステムは崩壊する。

特に、テラバイト級、あるいはそれ以上の超大規模データセットを扱う現場において、PHDAM(Partitioned Hierarchical Direct Access Method)とPHIDAM(Partitioned Hierarchical Indexed Direct Access Method)の選択と物理定義(DBD: Database Definition)は、システムの生死を分ける決定打となる。

今日は、このPHDAMとPHIDAMの深層を抉り出し、実務の現場で即座に使える堅牢な設計パターンを伝授しよう。

—

1. なぜ PHDAM / PHIDAM なのか?(アーキテクチャの本質)

従来のHDAMやHIDAMは、単一の巨大なOSファイル(あるいはデータセット・グループ)として管理されていた。しかし、現代のデータ量は、1つのストレージ領域にすべてを収めることを許さない。

  • PHDAM: ハッシュアクセスによる高速なルートセグメント検索を維持しつつ、データセットを物理的に複数のパーティションに分割する。
  • PHIDAM: 高度な索引(Primary Index)を用いた順次アクセスを維持しつつ、同様にパーティション分割を行う。

ここで重要なのは、「論理的な階層構造は1つに見せかけながら、物理的なストレージとI/Oを完全にスケールアウトさせる」という点だ。これを見誤ると、ホットスポット(特定のパーティションへのI/O集中)が発生し、どんなに高価なハードウェアを並べてもスループットは頭打ちになる。

—

2. 実践:DBD(Database Definition)のコードレビュー

百聞は一見に如かず。まずは、私がプロジェクトで厳格にレビュー・承認しているPHDAMのDBDマクロ定義のサンプルを見せよう。

———————————————————————-

  • PHDAM データベース定義 (DBD) のサンプル

———————————————————————-
DBD NAME=CUSTDB,ACCESS=PHDAM 階層型かつパーティション化HDAMを指定

  • 仮想ストレージおよびバッファプール要件の定義

DATASET BLOCK=(4096,35790), ブロックサイズとオプティマム値
OSAM, アクセス方式 (OSAM/VSAM)
RDBASE=CUSTLIB データセット群のベース名

  • セグメント階層の定義

SEGM NAME=CUSTSEG, ルートセグメント (顧客マネージャ)
PARENT=0, 親なし (ルート)
BYTES=(120,50), 最大長 / 平均長
PTR=NOTWIN 同一階層ポインタ不要 (ルートのため)

  • ルートセグメントのランダム化ルーチン (RPA) の指定
  • ※ここがPHDAMの命運を握る。衝突率の低いアルゴリズムを選定せよ。

LCHILD NAME=(CUSTX,CUSTLIB), パーティション索引への言及
POINTER=SNGL ポインタ指定
DEVTYPE=3390 デバイスタイプ

DBDGEN DBD生成の終端
FINISH
END

チーフアーキテクトの視点:ここがポイントだ

1. ブロックサイズとストレージ効率
`BLOCK=(4096,35790)` の指定を見てほしい。ここではOSAM(Overflow Sequential Access Method)を使用している。ブロックサイズに対する実効容量のチューニングを怠ると、OSレベルのI/Oペナルティをモロに食らう。
2. ランダム化ルーチン(Randomizing Module)の選定
PHDAMの性能は、ルートセグメントをどのブロックに割り振るかを決める「ハッシュ関数(ランダム化ルーチン)」の出来栄えで9割決まる。偏ったキー設計を放置してランダム化任せにすると、特定のパーティションだけがオーバーフローし、連鎖的なI/O遅延を引き起こす。

—

3. PHDAM vs PHIDAM:どう使い分けるべきか?

設計レビューで最も多く受ける質問がこれだ。「先生、ウチのデータはPHDAMとPHIDAM、どっちにすべきですか?」
私の答えは一貫している。「アクセスパスの偏りとバッチ処理の要件を見ろ」。

| 評価軸 | PHDAM (Partitioned HDAM) | PHIDAM (Partitioned HIDAM) |
| :— | :— | :— |
| 主アクセス方式 | ハッシュ(ダイレクト・アルゴリズム) | 索引順次(Primary Index経由) |
| ルート検索性能 | 圧倒的に高速(理論値 1~2 I/O) | 索引ツリーの分、ややコスト増 |
| 順次処理(Seq Scan)| 極めて非効率(バラバラに配置されるため) | 極めて効率的(索引順にスキャン可能) |
| 向いている用途 | オンライントランザクション(OLTP)でキー直叩きするデータ | 月次バッチなどで全件シーケンシャル処理が必須のデータ |

現場の判断基準

  • OLTP主体の顧客マスタ・口座マスタ: PHDAMを選べ。秒間数千件のランダムアクセスをさばくにはこれしかない。ただし、パーティション境界を決めるキー範囲(High Key)の設計には細心の注意を払え。
  • 履歴データ・集計前提のトランザクション: PHIDAMを選べ。バッチ処理で「キー順にきれいに舐めたい」という要件がある場合、PHDAMを選ぶとヘッドのシークが暴発し、バッチウィンドウに確実に収まらなくなる。

—

4. パーティション定義(PSB/Partition Definition)の堅牢な設計パターン

データベース定義(DBD)だけでは完了しない。パーティションの境界値(High Key)を定義するパーティション定義(HALDB Partition Definitionなど)が不可欠だ。

ここで適当なキー設計をすると、後からパーティションの分割・統合(スプリット/マージ)を行う羽目になり、現場の運用チームから殺意を向けられることになる。

堅牢なキー設計のアンチパターンと正解

  • 【アンチパターン】連番(オートインクリメント)をパーティションキーにする
  • 末路: すべての新規INSERTが「最後のパーティション」に集中し、真のパラレル処理が完全に崩壊する。
  • 【正解】業務的な分散キー(顧客IDのハッシュプレフィックス、あるいは地域コード + タイムスタンプ)にする
  • 理由: データの発生源が均等に各パーティションへ分散するため、PHDAM/PHIDAMの並列I/Oの恩恵を100%引き出せる。

—

5. パフォーマンス・チューニングの極意:I/Oの呪縛から逃れるために

最後に、実務でパフォーマンス問題に直面したときの処方箋を授ける。

1. Free Spaceの適切な配分
PHDAM/PHIDAMともに、データセット内には「将来の挿入(Insert)」のためのFree Space(FSE)を確保する必要がある。これをケチると、すぐにオーバーフローエリアへの飛びつきが発生し、チェイン(ポインタの連鎖)が伸びきってI/Oが激増する。定期的な統計情報の採取と、再編成(Reorganization)の自動化を設計段階から組み込め。
2. バッファプール(BFPOOL)の独立管理
パーティションごとにアクセス頻度が異なる場合、すべてのパーティションを同一のバッファプールに相乗りさせてはならない。ホットスポットとなるパーティションには専用の高速バッファプールを割り当て、LRUアルゴリズムのヒット率を極限まで高めろ。

—

総括

PHDAMおよびPHIDAMの設計は、単なる「データ置き場の分割」ではない。
ハードウェアの物理特性、OSのI/O境界、そしてアプリケーションのアクセスパターンを完全に理解した者だけが描ける「建築物」だ。

「動けばいい」という妥協は、大規模データの海の前では一瞬で瓦解する。
次の設計レビューでは、君たちがロジカルで隙のないパーティション戦略を持ち寄ることを期待している。質問があればいつでも私の席に来たまえ。

コメント

タイトルとURLをコピーしました