プロンプトとコンテキスト
あるリレーショナルデータセットに顧客、口座、送金データが含まれています。面接官は、再帰SQLに対してBigQuery Graphをいつ使用すべきか、そして検証可能な移行およびロールバック計画をどのように設計するかを尋ねています。
これはデータエンジニアリング、アナリティクスエンジニアリング、データプラットフォームの職種を対象としています。データはすでにBigQuery内に存在し、グラフ機能はまだプレビュー(Preview)段階であると想定してください。プレビューを無条件の本番保証として扱ってはいけません。ここでの課題は、どちらかのクエリ言語が常に高速であると主張することではなく、関係性の表現力、ガバナンス、コスト、互換性を比較することです。
面接官が評価するポイント
面接官は、グラフモデルまたはリレーショナルモデルを選択する前にクエリの形状(特性)を分類しているか、そしてビジネスセマンティクス、実行計画、プラットフォームのライフサイクルを切り分けて考えているかを見ています。優れた回答では、グラフモデルが既存のテーブルとどのように共存するか、再帰SQLの方がシンプルなのはどのような場合か、そして同一のベンチマークデータを用いてどのように移行を検証するかを説明します。
回答前に確認すべき明確化のための質問
- トラバーサルは固定深度ですか、それとも深さやパスの述語が頻繁に変更されますか?
- 結果としてノード、エッジ、パスを返す必要がありますか、それとも集計メトリクスのみで十分ですか?
- これはバッチ分析ですか、それとも低レイテンシのオンライントラバーサルですか?
- 結果は既存のSQLレポートと行単位で一致する必要がありますか?また、プレビューの互換性期間はどのくらいですか?
- 予算、スキャン量、同時実行性、鮮度、およびダウンストリームクライアントの制約は何ですか?
30秒の回答フレームワーク
「私はまずクエリの形状と配信ターゲットによってルーティングします。固定の1〜2ホップのトラバーサル、単純な集計、価値のある既存のSQL資産にはSQLを維持します。マルチホップパターン、パスの述語、関係性の再利用が頻繁な場合にBigQuery Graphを評価します。ノード、エッジ、ラベル、キーを定義した上で、同一のスナップショットに対してGQLと再帰SQLを実行し、結果、処理バイト数、レイテンシ、コストを比較します。Graphはプレビュー段階であるため、ゲートを通過するまではSQLをプライマリパスとして維持し、Graphはシャドウモードで実行します。」
ステップごとの詳細解説
1. リレーショナルの問いをグラフに変換する
PersonとAccountをノードとして、OwnsとTransfersを有向エッジとしてモデル化し、各エッジに時間、金額、安定した識別子を持たせます。「3ホップ以内で到達可能な口座を見つけてリスクを集計する」は本質的にパスクエリですが、「日別の送金合計額を算出する」はリレーショナル集計として監査する方が容易です。機能の新規性ではなく、問いの内容に合わせてモデルを選択すべきです。
2. クエリの形状からルートを選択する
固定の深さ、固定の列、メトリクスのみの出力の場合、可読性と既存のアクセス制御の面で再帰SQLが有利になることがよくあります。可変の深さ、再利用可能なパターンのパス、ノードやエッジを含む結果が必要な場合は、GRAPH、MATCH、NEXT、RETURNなどのGQL構文を使用することで、関係性に即した意図をより適切に表現できます。ここでの判断基準は変更頻度と保守コストであり、SQLを一括して置き換えることではありません。
3. セマンティックの境界をモデル化して固定する
ラベル、方向、NULL許容プロパティ、有効期間、重複エッジの処理を定義します。重複ロードによってパス数が水増しされないよう、各ビジネス関係にキーを付与します。無限ループを防ぐために、トラバーサル中にノードの再訪問を許可するかどうかを定義します。グラフ構文は関係性を表現しますが、機密フィールドの保護は依然としてデータセットの権限、列ポリシー、監査によって行われます。
4. 再現可能なデュアルランベンチマークを構築する
代表的なスナップショットとクエリファミリ(1ホップの隣接ノード、2ホップの送金、時間制限付きパス、重複エッジ、空の結果など)を使用します。セットと件数を比較する前に、再帰SQLとGQLの双方をノードID、エッジID、パスの長さ、集計値に射影(プロジェクション)します。処理バイト数、スロット使用量、p50/p95レイテンシ、エラー、鮮度を記録します。1回限りの実時間(wall-clock)の測定結果は証拠にはなりません。
snapshot = freeze_partition(as_of)
expected = run_recursive_sql(snapshot, query_family)
candidate = run_gql_graph(snapshot, query_family)
assert canonicalize(expected) == canonicalize(candidate)
gate = error_rate < 0.01 and p95_ms <= budget and cost_per_query <= limit5. GraphとSQLの相互運用性を維持する
レポートで依然として表形式の入力が必要な場合は、グラフの結果をテーブルに射影し、SQLの集計やディメンションと結合します。双方が同一の関係性を使用する場合は、ノードやエッジの複製を避けます。GoogleのドキュメントにはGRAPH_TABLEを介してグラフクエリとSQLを組み合わせる方法が記載されているため、すべてのパイプラインを書き直すことなく、クエリファミリ単位で移行を分割できます。
6. プレビューのリスク評価とロールバック
プレビューのリージョン、バージョン、クォータ、サポート範囲を個別に記録します。SQLをプライマリパスとして維持し、Graphはシャドウモードで実行します。結果の一致、予算、権限、モニタリングのゲートを通過した後にのみ、クエリファミリ単位で有効化します。スキーマのドリフト、結果の不一致、クォータ超過エラー、コストの異常が発生した場合は、スナップショット、クエリテキスト、実行メトリクスを保持したままSQLへルーティングを戻します。
高品質な回答サンプル
私ならまずクエリの形状から検討を始めます。固定深度、固定列、単純な集計のレポートは、プレビューへの依存と移行コストを抑えるために再帰SQLのまま維持します。可変深度、再利用可能なパスパターン、ノードおよびエッジの出力が必要な探索的分析に対してBigQuery Graphを評価します。顧客と口座をノード、所有権と送金を有向エッジとしてモデル化し、キー、方向、有効期間、サイクルのルールを確定します。移行にあたっては、同一スナップショット上で両方のパスを並行実行し、出力を同一のノード、エッジ、パス長、メトリクスに正規化した上で、結果、バイト数、p95、失敗率、コストを比較します。Graphをシャドウモードで実行する間、SQLがプライマリのままとなります。プレビューのリージョン、クォータ、バージョンの変更、またはいずれかのゲートで不合格となった場合はSQLへロールバックします。これにより、単にグラフクエリの方が速いと主張するのではなく、表現力、ガバナンス、コスト、ロールバックを網羅できます。
よくある間違い
- 複数のJOINを見てすぐにグラフへ切り替える → 固定深度の集計にはグラフが不要な場合があります → まずクエリの形状に基づいてルーティングする。
- 1回のクエリ実行だけでレイテンシを比較する → キャッシュ、スナップショット、スキューによって偶発的な結果が生じます → クエリファミリと固定スナップショットを使用する。
- 重複エッジとサイクルを無視する → パス数が水増しされたり、トラバーサルが終了しなくなったりします → キー、訪問ルール、最大深度を定義する。
- GraphのPreviewを安定した依存関係として扱う → リージョン、クォータ、セマンティクスが変更される可能性があります → シャドウ実行とゲートを設けてSQLをプライマリに維持する。
- 移行中に2つ目のグラフデータセットをコピー作成する → 鮮度とガバナンスに乖離が生じます → ソースを再利用し、結果を射影する。
フォローアップの質問と回答
探索の深さが2ホップから任意の深さに拡張された場合、何が変わりますか?
判断が変わる可能性があります。任意の深さやパスの述語は再帰SQLの保守コストとリソースリスクを高めるため、Graphのパス表現力がより魅力的になります。ただしその場合でも、最大深度、ノード訪問制限、コストゲートを設定し、無制限のトラバーサルは決して許可しないようにします。
ビジネス側から1秒以内のオンライン応答を求められた場合はどうしますか?
まず、BigQueryのバッチ分析がそのレイテンシ目標を満たせるかを確認します。満たせない場合は、オンライングラフストアまたは事前計算されたインデックスを維持し、BigQuery Graphはバッチ検証や履歴分析用として使用します。言語の統一性のためにオンラインSLOを犠牲にしてはなりません。
GQLと再帰SQLが等価であることをどのように証明しますか?
同一のパーティションスナップショットを固定し、空の結果、重複エッジ、時間境界、サイクルを網羅するクエリファミリを実行した上で、安定したキーと集計値を正規化して比較します。差異が発生した場合は、最小の反例、クエリバージョン、データスナップショットを保存します。
SQLへのフォールバックはいつ削除できますか?
プレビューのステータス、リージョン、クライアント互換性が安定し、複数のデータサイクルにわたって結果、コスト、レイテンシ、権限、障害訓練のゲートをクリアし、データオーナーの承認を得た後に限られます。それ以外の場合はSQLを保持します。
グラフの関係性が機密情報である場合、権限管理はどのように機能させるべきですか?
データセット、列、行レベルのポリシーを再利用し、グラフ結果の射影段階で可視フィールドを再チェックします。ノードやエッジへの到達可能性自体が関係性を明らかにしてしまう場合があるため、パスの露出についても監査ケースに含める必要があります。