跳转到内容
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 密钥