跳转到内容
← 返回 Cosmos DB 概览
Flagship · Cross-DB
独有 — 仅在 NoSqlStudio
Ctrl+Alt+Shift+Q

Query Regressions

每条 query 都会得到一个稳定的 fingerprint(Oracle sql_id-style),能在 literal 值变化时依然不变,因此即使 filter 值不同,"同一条 query" 仍是一行。NoSqlStudio 学习每个 fingerprint 的 baseline(EWMA/MAD),对 live stream 进行 instance-wide 监视,一旦某条 query regress,就从五个层级解释为什么 —— 从 before/after metrics 一直到 AI root-cause 叙述。它是唯一在 MongoDB、Azure Cosmos DB(Mongo API)和 AWS DocumentDB 上都能做到这一点的 IDE。

它在应用中的位置: Monitoring ▾ → Query Regressions

DBA 为何需要 Query Regressions

slow-query log 只告诉你某条语句很慢。它从不告诉你是哪条 query、它是否一直如此、发生了什么变化,甚至这是否重要 —— 于是 DBA 只能在凌晨 2 点 grep 日志、手动关联、靠猜。Query Regressions 就是为了终结这一切而存在的。

它为每条 query 赋予一个稳定的身份(一个能在数值变化时依然不变的 fingerprint),学习每条 query 的 "normal" 是什么样,并对整个 instance 进行 live 监视。问题不再是 "是不是有东西变慢了?",而变成 "正是这条 query 刚刚慢了 74 倍,这是变化的那个 plan,而且两分钟前有一个 index 被 drop 了。"

这之所以重要,是因为代价高昂的事故往往是悄无声息的:维护窗口中被 drop 的一个 index、改变了 query 形状的一次 deploy、悄悄越过阈值的 data growth、翻倍的 Cosmos 账单。它们都不会给你发告警 —— 直到客户来找你。它在这些问题一 regress 时就抓住它们并指出原因,在 MongoDB、Cosmos 和 DocumentDB 上一视同仁。

而且它尊重 DBA 的现实:你的笔记本不是服务器。你为自己选定的 scope 和 window 启动监控;告警通过 Slack、Discord、Teams 或操作系统送达你;history 在重启后依然保留;AI 还会写好那份你原本要手动拼凑的 root-cause 摘要。更少的翻日志、更快的 MTTR、更少的凌晨 2 点惊吓。

它做什么

  • 每种 query 形状有稳定的 sql_id-style fingerprint —— MongoDB 上用原生 queryHash,Cosmos/DocumentDB 上用 client-side shape-hash —— 因此一条 query 在不同 literal 值下都保持同一身份。
  • Cross-engine by design:MongoDB / Atlas、Azure Cosmos DB(Mongo API)和 AWS DocumentDB —— 唯一在这三者上都提供 regression RCA 的工具。
  • Instance-wide live capture:它能看到每个 client 的 queries,因此能抓住维护窗口中未声明的变更 —— 而不仅是你恰好运行的那些 query。
  • 5 级 root cause:(1) before/after metrics,(2) execution-plan diff,(3) index / cardinality probes,(4) 在 ±5 min 内关联的 DDL 与 deploy events,(5) 用你自己的 LLM 生成的 AI 叙述。
  • 对原因进行分类:plan change、selectivity collapse、data growth、RU spike,或一个全新的缓慢 collection scan。
  • Per-engine metric:MongoDB / DocumentDB 上为 p95 latency,Cosmos 上为 RU。
  • DBA-driven monitoring:你在界面上启动它(整个 instance 或选定的 databases,可选定时);它作为一个 Job Manager job 运行,带有一个 live recording 点 —— 你的笔记本不是服务器。
  • 对已确认的 regressions 进行告警:原生 OS notification + webhook(从 URL 自动检测 Slack、Discord 和 Microsoft Teams),并带有一个由你以秒为单位设置的 re-alert interval。
  • 一切都会持久化:学习得到的 baselines 和 alert history 在重启后依然保留(file + MongoDB mirror),因此夜间发现的 regression 早上依然在 —— 按时段 filter、标记 read/unread、删除。
  • 一键 remediation:在 plan change 时 clear plan cache、acknowledge、snooze,或打开 explain plan。

分步

  1. 1

    打开 Monitoring ▾ → Query Regressions

    该 tab 打开时会显示此前为该 connection 触发的 alerts,按 database 分组。读取 history 无需任何配置。

  2. 2

    为你关心的 scope 启动监控

    点击 Start 并选择整个 instance 或特定 databases,可选地带上 start/end 计划。它会作为一个 job 注册到 Job Manager,并独立于该 tab 持续运行。

  3. 3

    示例 —— 一个 "new slow query"

    对大量 docs 进行的首次出现的 collection scan 会立即被标记,无需 baseline。对未建索引字段的 filter 是经典情形:

    // unindexed field -> COLLSCAN over the whole collection
    db.orders.find({ promoCode: "BLACKFRIDAY" })
    
    // → card: New slow query — shop.orders
    //   plan: COLLSCAN  ·  docs examined 1,550,000  ·  p95 642 ms  ·  WARN
  4. 4

    示例 —— 一个 baseline regression

    一条相对其学习得到的 baseline 本来很便宜的 query,突然代价高出许多。同一个 fingerprint,只有 plan/cost 变了 —— 例如一个 index 被 drop,IXSCAN 翻转为 COLLSCAN:

    // same query, same fingerprint — only the plan changed
    baseline (35 samples):  IXSCAN { userId:1, status:1 }   p95   2.5 ms
    now:                    COLLSCAN                        p95 185.0 ms
    
    // → card: Plan regression — shop.orders
    //   delta 74x  ·  cause: plan-change  ·  CRITICAL
    //   what changed nearby: dropIndex idx_user_status (2 min before)
  5. 5

    阅读 card + 获取 AI root cause(Level 5)

    Severity、fingerprint、latency 和 docs examined 的 Baseline → Now、plan diff、query 形状,以及附近发生的变化。然后用你自己的 LLM 运行 Level-5 分析 —— 它只读取 fact sheet,并以最可能的单一原因 + 一个 confidence score 结束。

  6. 6

    修复它,并在下次得到告警

    Clear plan cache 或添加 index;在 Settings ▸ Alerting 中一次性设置 OS + Slack/Discord/Teams 告警,这样下一次 regression 无论你在哪都能找到你。

真实用例

悄无声息的 regression

一个 nightly job drop 了一个 index。凌晨 2 点,一次 find() 在一个 1.5M-doc collection 上把 IXSCAN 翻转为 COLLSCAN。Card 带着 plan diff 触发,而 dropIndex event 关联到 2 分钟前 —— root cause 一屏呈现,无需翻日志。

抓住一次糟糕的 deploy

一次发布改变了 query 形状,使其不再使用 composite index。Regression 在几分钟内确认,Level-4 timeline 指向 deploy marker —— 在 on-call 被 page 之前完成了回滚。

Cosmos 账单激增

一次 selectivity collapse 后,某条 query 的 RU cost 翻了三倍。before/after 的 RU 加上 AI 叙述,在月末计费之前给出了 partition/index 修复方案。

维护窗口期间未声明的变更

Instance-wide capture 在一个并非计划变更范围内的 database 中标记了 regression —— out-of-scope safety banner 在它演变成事故之前就将其浮现出来。

从手机进行 triage

已确认的 regressions 会带着 namespace 和 delta 推送到 Slack / Discord / Teams;只要问题仍未修复,re-alert interval 就会持续提醒,修复后即恢复安静。

FAQ

这和 slow-query log 有什么不同?

Slow log 给你的是孤立的行。Query Regressions 给的是每条 query 的稳定身份、一个学习得到的 baseline、跨五个层级分类的原因、与 DDL/deploys 的关联、一段 AI 叙述 —— 外加告警和 history。它告诉你发生了什么变化,而不只是说某个东西变慢了。

它真的能在 Cosmos DB 和 DocumentDB 上工作吗?

能 —— 这正是重点所在。MongoDB 读取 slow log,Cosmos 读取 Azure diagnostic logs(以 RU 作为 metric),DocumentDB 读取 CloudWatch profiler。三者使用相同的 fingerprint + RCA 模型。

我必须让 app 一直开着吗?

Monitoring 在 NoSqlStudio 打开时运行(无论 tab 是否打开),并通过重新加载持久化的 baselines 在重启后存续。一个 headless 的 7×24 agent 是 roadmap 上的另一款独立 product。

Alerts 发到哪里?

一个原生 OS notification 加上一个可选的 webhook。一个 URL 即可用于 Slack、Discord 或 Microsoft Teams —— payload 会按 provider 适配。Re-alert interval(以秒计)控制一条仍处于 regressed 状态的 query 多久重新通知一次。

AI 步骤会向 LLM 发送什么?

只有一份精简的 fact sheet(before/after metrics、plan diff、index findings、cardinality、query 形状)。你通过 AI Registry 自带 provider/key;在你运行分析之前,什么都不会离开本地。

准备好在您的 Cosmos 账户上查看了吗?下载 NoSqlStudio下一个 → Operations Center