Apex動的リレーションシップ解決:二分探索と線形スキャンのパフォーマンス比較

Apex動的リレーションシップ解決:二分探索と線形スキャンのパフォーマンス比較 Salesforce
Apex動的リレーションシップ解決:二分探索と線形スキャンのパフォーマンス比較

どんな取り組みか

本記事では、Apexにおける動的なリレーションシップ解決のパフォーマンス改善策として、二分探索法と線形スキャンの比較検証を行います。特に、子リレーションを解決する際に発生するSObjectのリフレクション処理におけるgetDescribe()メソッドの負荷に着目し、効率的な解決方法を探求します。

使われた技術スタック

本記事で扱われている主な技術は以下の通りです。

  • Apex
  • SalesforceのメタデータAPI (Schemaクラス)
  • アルゴリズム (二分探索、線形スキャン)

実装のポイント

動的なリレーションシップ解決では、子となるSObjectのクラスからリレーション名を特定するために、親のSObjectが持つ子リレーション情報を取得し、その名前を比較する処理が必要です。具体的には、以下のステップが考えられます。

  1. 子となるSObjectのクラスから、子オブジェクト名を生成する。
  2. 親のSObjectのリレーション情報を取得する (Schema.SObjectType.getDescribe().getChildRelationships() メソッドを使用)。
  3. 取得したリレーション情報を巡回し、子オブジェクトの名前を取得する。
  4. 生成した子オブジェクト名と取得したリレーション名が一致するかチェックする。
  5. 一致した場合、そのリレーション名を取得する。

このプロセスにおいて、Schema.ChildRelationship 型からリレーション名を取得する際に、子オブジェクト名のメタデータを取得する getDescribe() メソッドが重い処理となることが問題視されています。子リレーション情報の並び順にはUnicodeの数値順という法則性があるため、この特性を利用して効率化を図ります。

具体的には、以下の3つの検索方法でパフォーマンスを比較します。

  1. フルスキャン: リストの先頭から順に検索する方法。
  2. 双方向スキャン: 検索対象の名前の先頭文字に応じて、リストの先頭または末尾から検索する方法。
  3. 二分探索法: リストの中央から検索を開始し、対象が見つかるまで探索範囲を半分に絞り込んでいく方法。

これらの方法で、1000個のランダムなターゲット名を検索する際の getDescribe() の推定呼び出し回数を計測し、パフォーマンスを比較しました。

得られた成果や学び

検証の結果、以下の点が明らかになりました。

  • 二分探索法の優位性: 二分探索法は、フルスキャンや双方向スキャンと比較して、getDescribe() の呼び出し回数が劇的に少ないことが確認されました。特に、子リレーション数が多い場合にその差は顕著になります。
  • スケーラビリティ: 子リレーションの数が増加しても、二分探索法は getDescribe() の呼び出し回数がほぼ一定であるため、プロジェクトの規模が拡大しても動的リレーションシップ解決にかかる時間を効果的に抑制できると考えられます。
  • 子リレーション数が少ない場合でも有効: 子リレーション数が少ない場合でも、二分探索法はフルスキャンと比較して数倍の速度向上が見られました。

これらの結果から、Apexの動的なリレーションシップ解決において、二分探索法を適用することがパフォーマンス向上のための有効な手段であることが示唆されました。

まとめ

本記事では、Apexにおける動的なリレーションシップ解決のパフォーマンス改善策として、二分探索法と線形スキャンの比較検証を行いました。子リレーション情報の並び順の法則性を利用し、重い処理である getDescribe() の呼び出し回数を最小限に抑えるために二分探索法を適用することで、大幅なパフォーマンス向上が期待できることが実証されました。このアプローチは、特に子リレーション数が多い場合に有効であり、プロジェクトのスケーラビリティにも貢献すると考えられます。

出典: https://qiita.com/krile136/items/76a918fed02a6c56c744

Related Certifications

この記事に関連する技術領域の認定資格

Salesforce 関連資格

  • Salesforce Certified Administrator
  • Salesforce Certified Platform Developer I
  • Salesforce Certified Platform Developer II
  • Salesforce Certified Application Architect
  • Salesforce Certified System Architect
  • Salesforce Certified Technical Architect

※ 認定資格は技術スキルの体系的な学習に役立ちます。試験の出題範囲や受験要件は変更される場合があるため、受験前に必ず公式サイトで最新情報をご確認ください。

SF Tech & Win

Salesforce × AWS × AI 連携の実装ノウハウ

SIer・スタートアップ・中小企業のDX推進に役立つアーキテクチャ事例・実装パターン・最新アップデート情報を毎朝配信。

コメント

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