本文へ移動
Telemetry
データベースの信頼性 SQL レシピ

N+1 データベースクエリパターンの検出

1 つのアプリケーション リクエスト内で何度も繰り返されるデータベース フィンガープリントを検出します。

中級者database_request_query_eventsレビュー済み 2026-07-28テスト済み アパッチ DataFusion 45.2.0

レビュー者 Telemetry 製品チーム . SQL の互換性、イベント コントラクト、合成出力、および操作上の注意事項. 基準と所有権を確認する

質問に回答しました

リクエスト内で疑わしい繰り返しが行われるルートとクエリの組み合わせはどれですか?

N+1 の動作は相関関係の問題です。クエリは全体的には高速で無害である可能性がありますが、個々のリクエスト内では過度に繰り返されます。このパターンでは、影響を受けるルートを要約する前に、リクエストごとに各フィンガープリントをカウントします。

イベント契約

クエリが期待するフィールド

フィールド種類なぜ存在するのか
timestamp_utcTimestampクエリ完了時刻 (UTC)。
request_idUtf8制限されたリクエスト相関識別子。
route_templateUtf8安定した適用ルート。
query_fingerprintUtf8パラメータを持たない正規化されたクエリ形状。
sequence_in_requestInt64リクエスト内のクエリ順序。
duration_msFloat64データベース操作期間。
environmentUtf8導入環境。
DataFusion SQL

クエリをコピーする

sql
WITH queries_per_request AS (
  SELECT
    route_template,
    query_fingerprint,
    request_id,
    COUNT(*) AS executions_in_request
  FROM database_request_query_events
  WHERE timestamp_utc >= now() - INTERVAL '24 hours'
    AND environment = 'production'
  GROUP BY route_template, query_fingerprint, request_id
)
SELECT
  route_template,
  query_fingerprint,
  COUNT(*) AS requests,
  SUM(CASE WHEN executions_in_request >= 5 THEN 1 ELSE 0 END)
    AS requests_with_repeats,
  AVG(executions_in_request) AS average_executions_per_request,
  MAX(executions_in_request) AS maximum_executions_in_request
FROM queries_per_request
GROUP BY route_template, query_fingerprint
ORDER BY requests_with_repeats DESC, route_template;

この読み取り専用クエリは、空の型付きテーブルに対して計画され、実行されます。 アパッチ DataFusion 45.2.0。決定論的なサンプル出力は合成され、個別にレビューされます。フィールド タイプ、しきい値、ビジネス定義を独自のデータと照合して検証します。 テスト方法を読んでください。

クエリ結果

リクエスト内で繰り返されるクエリ

チェックアウト ルートは、2 つのリクエストで品目フィンガープリントを少なくとも 5 回繰り返します。

route_templatequery_fingerprintrequestsrequests_with_repeatsaverage_executions_per_requestmaximum_executions_in_request
/api/checkoutSELECT line_items BY order_id3246
/api/profileSELECT user WITH preferences3011

合成出力例。運用上の決定に使用する前に、独自のイベント スキーマとしきい値に対してクエリを実行します。

Repeated queries inside requests: Detect N+1 Database Query Patterns 結果例からの合成 requests_with_repeats 値の静的チャート
決定論的な出力例のインデックス可能な SVG。記事、ランブック、または出典を明示した設計レビューのためにダウンロードしてください。

例を再現する

パブリックフィクスチャをダウンロードする

JSON バンドルには、型付きイベント コントラクトが含まれています。 reproducible 入力行、正確な SQL、予想される出力、レビューメモ、およびエンジンのバージョン。 CSV には、表示された結果が含まれます。

SQL の仕組み

  1. 1内部クエリは、ルート レベルの集約の前に、リクエスト レベルの繰り返しを確立します。
  2. 2制御されたフィンガープリントは、生の SQL 値を保持せずに、同等のパラメーター化された操作をグループ化します。
  3. 3蔓延と最悪の場合の繰り返しの両方が維持されるため、1 つの極端な要求が体系的に見えることはありません。

決定すべきエッジケース

  • 意図的なバッチ処理とページネーションの動作に適合するしきい値を選択します。
  • 非同期作業には、リクエストからワーカーへのハンドオフ後も存続する相関識別子が必要です。
  • クエリ イベントをサンプリングすると、正確な繰り返し回数が隠蔽される可能性があります。トレースを意識したサンプリングを使用するか、推定値を文書化します。

推奨されるダッシュボード

  • バー: ルートおよびフィンガープリント別の requests_with_repeats
  • 傾向: リリースごとのリクエストあたりの平均実行数
  • トレース リンク: 選択した request_id のクエリ シーケンス

アラートガイダンス

反復クエリの蔓延が大幅に増加した場合は、1 つのリクエストでページングするよりもリリース回帰アラートを優先します。

アラート設定を読む

レシピを活用する

関連する機器とガイド

分析を続ける

実際のイベントで実行する

テーブルを作成し、フィールドを調整して、結果を保存します

無料で始めて、構造化されたイベントを送信し、クエリ結果をグラフ、共有ダッシュボード ウィジェット、またはアラート入力として使用します。

API キーを取得する