跳至主要內容
Telemetry
資料庫可靠性 SQL查詢範例

檢測 N+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。確定性樣本輸出是綜合的並單獨審查;根據您自己的資料驗證欄位型別、閾值和業務定義。 閱讀測試方法。

查詢結果

請求內重複查詢

結帳路由在兩個請求中至少重複其行專案指紋五次。

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普遍性和最壞情況的重複都被保留,因此一種極端的要求看起來並不具有系統性。

需要決定的邊緣情況

  • 選擇適合有意批次處理和分頁行為的閾值。
  • 非同步工作需要一個相關識別符號,該識別符號在從請求到工作人員的切換中仍然存在。
  • 取樣查詢事件可以隱藏精確的重複計數;使用追蹤感知取樣或記錄估計值。

推薦儀表板

  • 酒吧:requests_with_repeats(按路線和指紋)
  • 趨勢:按版本劃分的每個請求的平均執行次數
  • Trace連結:查詢所選request_id的序列

警示指導

當重複查詢流行率大幅上升時,首選發布迴歸警示,而不是針對一個請求進行分頁。

讀取警示設定

讓查詢範例發揮作用

相關埋點和指南

繼續分析

在真實事件中執行它

建立資料表,調整欄位並儲存結果

免費開始,傳送結構化事件,並將查詢結果用作圖表、共享儀表板小工具或警示輸入。

獲取 API 金鑰