技術ブログ / 読了 約 11 分

Pega BIXによる大量データ抽出設計|増分抽出と全件抽出の判断

BIXは「とりあえず全件出す」で組むと件数増加で破綻する。コミット日時(pxCommitDateTime)を基準にしたBIX標準の増分抽出、公開列とBLOBの性能差、DWH連携の運用設計。LSAが押さえる抽出設計の勘所をまとめる。

結論から:大量・増加するデータは「増分抽出」を前提に設計する

Pega で蓄積したケースやデータを、外部の分析基盤やデータウェアハウス(DWH)へ吐き出す——この要件が出てきたとき、多くのプロジェクトが使うのが BIX(Business Intelligence Exchange) です。BIX は Extract ルールで「どのクラスの、どのフィールドを、どういう条件で抜くか」を定義し、ファイルやデータベースへ一括抽出する仕組みです。

ここで最初に、そして最も重大な判断が 「増分抽出にするか、全件洗い替えにするか」 です。結論を先に言います。

件数が大量、または今後も増え続けるデータは、原則として増分抽出(日次差分)を前提に設計する。全件洗い替えは、件数が小さく頭打ちのマスタ的データに限定する。

BIX は「とりあえず全件出す」で組み始めると、初期は動いてしまいます。問題は運用に乗ってから顕在化します。ケースやトランザクションは業務量に比例して積み上がるので、毎晩の全件抽出はいずれ実行時間・DB 負荷・連携先の取り込み時間のすべてを圧迫し、バッチ枠に収まらなくなります。この記事では、その判断を具体的な分岐に落とし込み、公開列と BLOB の性能差、DB 出力とファイル出力、実行方式までを設計視点で整理します。

増分抽出と全件抽出の判断フロー 対象が大量または増加し、コミット日時で変更分を識別でき、連携先で冪等に再取り込みできるなら増分抽出、どれか欠けるなら全件抽出にする判断フロー図。 BIX でどう抽出する? ① 全件では重い規模か、 今後も件数が増え続ける? はい ② コミット日時で変更分を確実に識別できる? はい ③ 連携先で冪等に再取り込みできる? はい 増分抽出(日次差分) ① 〜 ③ すべて「はい」 全件抽出 (洗い替え) ① 〜 ③ の どれかが「いいえ」 いいえ いいえ いいえ 件数が頭打ちで小さいなら、全件洗い替えの方が設計も運用もシンプル
図:規模・増加傾向があり、コミット日時で変更分を識別でき、連携先で冪等に再取り込みできるなら増分抽出。どれか欠けるなら全件抽出に寄せる。

BIX とは — Extract ルールで定義する一括抽出

BIX は、Pega のクラス(ケースクラスやデータクラス)を対象に、指定したフィールドと条件で一括抽出を行う機能です(Pega-BIX ルールセットが提供する Rule-Admin-Extract ルール型)。中核となるのが Extract ルール で、1 つの Extract ルールは 1 つのクラスを対象に、以下を定義します。

  • 対象クラス — どのクラス(ケース/データ)を抜くか
  • 抽出するフィールド(Definition タブ) — 出力する列と、その並び・データ型
  • 抽出条件(Filter Criteria タブ) — どのインスタンスを対象にするか(この条件設計が増分/全件を分ける)
  • 出力先(File Specification タブ) — ファイル(CSV/XML 等)か、データベーステーブルか

BIX の強みは、ケースの BLOB(Storage Stream)内に格納されたプロパティも抽出できる点です。Pega はケースのデータをシリアライズ・圧縮した BLOB(pzPVStream 列。暗号化は任意設定)として保持しますが、BIX はこれを展開して個々のプロパティを列として取り出せます。ただし後述するとおり、この「BLOB からの展開」こそが性能設計の分岐点になります。

増分抽出と全件抽出をどう選ぶか

判断は図の3つの問いに集約されます。順に見ていきます。

全件抽出(洗い替え)が向く場面

毎回すべてのインスタンスを抜き、連携先を丸ごと置き換える方式です。以下のようなデータに向きます。

  • 件数が小さく、今後も大きく増えない(区分マスタ、料率表、拠点一覧など)
  • 変更日時のような差分判定の手掛かりが乏しい
  • 「常に最新の全量スナップショットが欲しい」という要件

全件抽出の最大のメリットは シンプルさと冪等性の担保のしやすさです。毎回まっさらから作り直すので、「どこまで抜いたか」を覚えておく必要がなく、途中で失敗してももう一度全部流せば整合します。数千〜数万件規模のマスタなら、無理に増分化せず全件で割り切るのが正解です。

増分抽出(差分)が向く場面

前回抽出以降に 新規作成・更新されたインスタンスだけ を抜く方式です。ケースやトランザクションのように、業務量に比例して積み上がるデータはこちらが原則です。

ここで押さえておきたいのは、BIX には増分抽出(incremental extraction)の仕組みが標準で用意されている点です。Extract ルールの Filter Criteria タブで増分抽出を有効にすると、pxCommitDateTime(インスタンスが DB 上で作成・更新された時刻。作成・更新の手段を問わずプラットフォームが自動でセットする)に対して「前回この Extract ルールが実行された時刻以降」という条件が自動的に付与されます。前回実行時刻は BIX 側が保持し、フィルタ条件では Last Extraction Time という記号値として参照できます。つまり、自前でウォーターマーク用のテーブルを組まなくても、素の増分抽出は BIX が面倒を見てくれます。

この増分抽出を成立させる前提は次のとおりです。

  1. pxCommitDateTime の公開列化と索引付け — 増分抽出はこの列を SQL 条件として発行するため、対象クラスのテーブルに pxCommitDateTime が公開列として存在しないと Extract は失敗します。件数が多いほど、この列へのインデックスが効きます。なお pxCommitDateTime が NULL のインスタンスは増分ではスキップされます
  2. 連携先の冪等性 — 同じ差分を二度流しても連携先が重複しないこと。連携先で主キーによる UPSERT(あれば更新、なければ挿入)を効かせ、境界時刻を厳密に扱って取りこぼし・二重取りを防ぎます

注意したいのは、BIX 標準の増分マーカーは「抽出が回ったこと」で前進するという点です。抽出自体は成功したが連携先の取り込みが失敗した、というときに次回が差分の続きから始まると、間の差分が連携先に届かず欠落します。「抽出+連携先取り込みが成功して初めて次に進む」という順序を担保したいなら、抽出と取り込みを疎結合にする(ファイル出力+独立したリトライで取り込む)か、pxCommitDateTime を条件にした DateTime フィルタを用いてウォーターマークを外部で自前管理する設計に切り替えます。

増分抽出のもう一つの落とし穴は 削除の検知 です。コミット日時を基準にすると「消えたレコード」は差分に現れません。物理削除がある業務では、論理削除フラグを立てて更新扱いにする、あるいは定期的にキー突合の全件照合を挟む、といった補助設計が必要になります。「増分だけで完結する」と思い込むと、連携先にゴーストレコードが残ります。

判断ポイント全件抽出(洗い替え)増分抽出(差分)
対象件数小さい・頭打ち大量・増え続ける
差分の判定手段不要コミット日時 pxCommitDateTime(BIX 標準の増分オプション)
抽出位置の管理不要(毎回まっさら)BIX が前回実行時刻を保持(Last Extraction Time)。連携先まで含めた整合は別途設計
前提の作り込みほぼ不要pxCommitDateTime の公開列化+索引が必要
冪等性の担保容易(全部作り直す)連携先の UPSERT+境界設計が前提
削除の反映自動で反映される別途 論理削除/全件照合が要る
実行時間の伸び件数に比例して悪化差分量に依存し安定
向くデータマスタ・区分表ケース・トランザクション

公開列(exposed columns)と BLOB — 性能設計の肝

BIX の性能を語るとき、よく「公開列から抽出すれば速く、BLOB から抽出すると遅い」と単純化されがちですが、ここには正確に押さえておくべき前提があります。

Pega は各プロパティをシリアライズ・圧縮した BLOB(Storage Stream, pzPVStream 列)に格納し、レポートや検索で頻繁に使う項目を 公開列(exposed columns) としてテーブルの実カラムにも切り出せます。ここで誤解されやすいのが、「公開列にすれば BIX がその実カラムから値を読んで速くなる」という理解です。実際には、BLOB を持つクラスでは、たとえ公開列があっても、BIX は抽出する値を常に BLOB から読みます。公式ドキュメントも「クラステーブルに BLOB(pzPVStream 列)がある場合、抽出は常にその BLOB 値から行われ、他の DB カラムからは行われない」と明記しています。ケースやワーク系のように BLOB を持つクラスでは、出力プロパティを公開列にしても「値の読み取り」自体は速くなりません(BLOB を持たない一部のデータクラスは例外で、この場合は実カラムから直接抽出されます)。

では公開列は BIX の性能に効かないのか——効きます。ただし効くのは フィルタと増分抽出の側です。

  • フィルタ条件は公開列しか使えない — Extract ルールの Filter Criteria で条件に使えるのは公開列だけです。選択性の高い条件を公開列(+インデックス)に対して掛ければ、BIX が開く BLOB の数そのものを減らせます。件数が増えるほど、この「絞り込みで BLOB を開かせない」効果が大きくなります
  • 増分抽出は pxCommitDateTime の公開列化が前提 — 前述のとおり、増分の差分条件はこの列に対する SQL 条件として発行されるため、公開列化と索引付けが速度を左右します
  • 抽出プロパティの数と入れ子の深さを減らす — BIX のスループットを決める主因は「抽出インスタンス数・抽出プロパティ数・プロパティの入れ子の深さ」の3つです。深くネストしたプロパティほど BLOB 展開が重くなるので、本当に要る項目だけに絞ります
  • 出力形式とエンジン設定 — CSV 出力は特定 DB で高スループット経路が自動的に使われ、大量抽出では有利です。加えて BIX 実行時は前方・後方チェイニングを無効化するとスループットが上がります

まとめると、公開列化は「頻繁に・大量に絞り込みの鍵にする項目」——とりわけ増分の pxCommitDateTime——に効かせるのが定石です。逆に、たまにしか使わない項目のためにやみくもに公開列を増やすと、書き込み時のオーバーヘッドやテーブル肥大を招くので、「BIX のフィルタ・増分で使う列かどうか」を基準に公開列を選ぶのが実務のバランスです。

観点フィルタ鍵を公開列化+絞り込み/増分無条件に全件を抽出
走査対象フィルタで絞り、開く BLOB を最小化毎回すべてのインスタンスの BLOB を展開
フィルタ・増分使える(条件は公開列が必須)pxCommitDateTime 未公開だと増分不可
値の取得元BLOB(値は常に BLOB が真)BLOB
大量件数での挙動差分・絞り込み量に依存し安定件数に比例して悪化
事前設計鍵項目の公開列化+索引が必要追加設計は不要だが重い

DB 直接出力 vs ファイル出力

出力先の選択も、再実行性・監査・運用要件で分かれます。

  • データベース直接出力 — DWH やステージングテーブルへ BIX が直接書き込む。中間ファイルが不要で連携がシンプル。反面、書き込み先スキーマとの結合が強くなり、失敗時のリカバリは連携先トランザクション設計に依存する
  • ファイル出力(CSV/XML 等) — 中間ファイルを介して連携先が取り込む。ファイルが証跡として残るため監査・再取り込みがしやすく、抽出と取り込みを疎結合にできる。反面、ファイルの受け渡し・保管・世代管理という運用が別途必要

再実行性と監査を重視するならファイル出力、連携をシンプルに保ちたく、連携先の取り込みまで一体で設計できるなら DB 直接出力、が基本の使い分けです。障害時に「もう一度その日の分だけ取り込み直したい」という要件が強いプロジェクトでは、ファイル出力が運用を楽にします。

実行方式と運用設計 — 監視・リトライ・再抽出

BIX の Extract は、コマンドライン起動(外部スケジューラから叩く独立した Java プロセス)と、Pega のジョブスケジューラ経由の実行があります。どちらを採るにせよ、「失敗したときにどう気づき、どう抜き直すか」までを設計に含めることが本番運用の分かれ目です。

  • 監視 — 実行の成否・件数・所要時間を記録し、異常(件数ゼロ、想定外の急増、時間超過)を検知できるようにする
  • リトライと再抽出 — BIX 標準の増分マーカーは抽出が回った時点で前進し、連携先の取り込み成否とは独立している。抽出は成功したが取り込みが失敗した、というケースで差分が欠落しないよう、**抽出と取り込みを疎結合にする(ファイル出力+独立リトライ)か、pxCommitDateTime フィルタでウォーターマークを外部管理し「連携先まで確定してから前進させる」**設計にする
  • 多重起動の防止 — 前夜のバッチが終わらないうちに次が走ると二重抽出になる。ロックや実行状態フラグで排他する

増分抽出で「連携先まで確定してから次の差分に進む」順序を担保したい場合は、BIX 任せにせず、ウォーターマークの前進タイミングを自分で握るのが肝心です。この一点を外すと、静かにデータ欠落が積み上がります。監視・スケジューリング・リトライを含むバッチ運用の作り込みは、Pega DevOps 支援 の観点とも重なります。

よくある失敗

BIX 抽出設計の失敗は、経験上いくつかのパターンに集約されます。

  • とりあえず全件で組んでしまう — 初期は動くが、件数増加でバッチ枠を超えて破綻する。ケース系は最初から増分前提で設計する
  • 削除を考慮しない増分 — コミット日時(pxCommitDateTime)ベースの増分だけで組み、連携先にゴーストレコードが残る。論理削除か全件照合の補助を入れる
  • 連携先の取り込み失敗を増分マーカーに反映しない — BIX の増分マーカーは抽出完了で前進するため、取り込みだけ失敗すると差分が欠落する。疎結合化か外部ウォーターマークで前進タイミングを握る
  • フィルタ鍵を公開列化しない — pxCommitDateTime など絞り込みの鍵を公開列化・索引化せず、毎回全件の BLOB を展開して抽出時間が件数とともに悪化する
  • 境界時刻の扱いが曖昧 — 「以上/超過」の境界設計を詰めず、二重取りや取りこぼしが発生する。UPSERT で冪等にしておけば被害を抑えられる

版・世代による違いに注意

BIX は長く使われてきた仕組みですが、Pega のバージョンや Constellation 世代によって、位置づけや推奨される代替手段が変わる場合があります。Infinity ‘25 時点では、レポーティング用データベースへのレプリケーションや、Kafka を用いたストリーミング・データエクスポートなど、バッチ以外でデータ連携を組む選択肢も加わっています。大量・定常のバッチ抽出には引き続き BIX が有力(BIX 自身もスケジュール実行とストリーミングの両方式を備えます)ですが、採用しているバージョンで BIX が推奨経路か、別の仕組みが適するかを、実装前に公式ドキュメントで確認してください。ここは「昔からこうだから」で決めず、版ごとに判断すべき領域です。

まとめ

  • 大量・増加するデータは増分抽出を前提に設計する。 全件洗い替えは小さく頭打ちのマスタに限定する
  • 増分抽出は **BIX 標準機能(pxCommitDateTime ベース)**で組み、連携先の冪等性(UPSERT+境界設計)と削除の検知を別途組み込む
  • フィルタ・増分の鍵(特に pxCommitDateTime)を公開列化・索引化する。値自体は BLOB から読まれるため、絞り込みで開く BLOB を減らすのが要点
  • DB 直接出力はシンプルさ、ファイル出力は再実行性・監査。要件で選ぶ
  • 実行方式は何であれ、監視・リトライ・再抽出まで設計に含める
  • BIX の位置づけは 版・世代で変わるため、採用版で確認する

BIX は「動かすだけ」なら簡単ですが、本番で何年も回り続ける設計にできるかどうかで真価が分かれます。抽出の初期設計でここを正しく決めておくことが、運用フェーズでの深夜対応やデータ欠落を防ぎます。


Pega のデータ連携・バッチ設計でお困りの際は、Pega Platform 開発支援 や 無料相談 をご利用ください。Pega 認定資格の最高位 LSA(Lead System Architect)を保有するコンサルタントが、性能と運用まで見据えた設計をご支援します。

関連リンク

RELATED

関連記事

Pega 宣言的処理のコスト設計|前方連鎖と後方連鎖の使い分け

Declare Expression は便利だが、前方連鎖のカスケードは1つのプロパティ変更が広範な再計算を引き起こす。宣言的処理は「書けば動く」半面、実行コストが見えにくい。本記事は前方連鎖と後方連鎖、宣言的と手続き的の境界線を、性能と保守性の観点で整理する。

記事を読む

Pega Insights と Report Definition の使い分け|セルフサービス分析と運用レポートの線引き

「レポートは Report Definition で作るべきか、Insights でユーザーに任せるべきか」——ダッシュボード設計で必ず出る分岐です。統制と再利用が要る定型レポートはルール化し、アドホックな探索はセルフサービスに開く、が基本方針。本記事では両者のガバナンス差とデータソースの前提から、線引きの判断軸を示します。

記事を読む

Pega 監査証跡設計:フィールド監査・履歴・セキュリティ監査の使い分け

「何を、どこまで監査するか」は Pega のセキュリティ設計で最も判断が割れるテーマです。フィールド監査・ケース履歴・セキュリティイベントの使い分けと、監査のかけ過ぎが招く性能・容量問題の回避策を、LSA の視点で解説します。

記事を読む

Pega 導入のご相談はお気軽に。

Pega Customer Service / Pega Constellation UI / Pega Platform の各ソリューションについて、無料でご相談を承ります。