窗口函数性能骤降的最直接证据是explain (analyze)中sort或windowagg节点出现“sort method: external merge disk”,表明排序已落盘,源于work_mem不足;需结合width过大或partitions过多等隐性指标提前预警。

看执行计划里有没有 Sort Method: external merge Disk
PostgreSQL 中这是最直接的铁证。只要 EXPLAIN (ANALYZE) 输出里某个 Sort 或 WindowAgg 节点后面跟着 Sort Method: external merge Disk,就说明排序已落盘,内存不够用了。这个信息不会出现在预估计划(只用 EXPLAIN)里,必须加 ANALYZE 才能触发真实执行并捕获。
常见伴随现象包括:
-
Actual Total Time显著拉长,尤其在WindowAgg节点上动辄几秒甚至分钟级 -
Buffers: shared read数值远高于shared hit,说明大量读磁盘临时文件 -
Plans下挂了一个明显更重的子节点(比如Seq Scan后紧接巨量Sort)
MySQL 里盯紧 Extra 字段和 Sort_merge_passes
MySQL 不会显示“落盘”字样,但会在 EXPLAIN 的 Extra 列暴露线索:Using filesort 是基础信号;若同时看到 Using temporary,基本等于确认窗口函数被迫建临时表+外部排序。
进一步验证要查状态变量:
一款AI工具,主要用于在主代理响应前,并行运行Kimi K2.5和GPT 5.3 Codex,注入双方观点以增强认知多样性,适合需要提升相关任务效率的用户。
- 执行查询前后运行
SHOW STATUS LIKE 'Sort_merge_passes' - 如果该值明显上升(比如从 0 → 100+),且查询耗时同步飙升,就是溢出发生
- 注意:单次查询可能触发多次
Sort_merge_passes,数值越大,落盘越严重
Trino 查 Spilled Data 和报错信息
Trino 默认不 spill,所以一旦出现 Query exceeded per-node user memory limit 这类 OOM 报错,90% 是因为没开 spill 配置,而不是数据真大到不可处理。
真正启用 spill 后,关键看是否生效:
- Web UI 的 stage 页面里,“Spilled Data”列非零(如
1.2GB)→ spill 已参与,但性能已受损 - 日志中出现
Spilling to disk或spilled 3 chunks→ 确认落盘行为发生 - 如果仍报 OOM,说明
max-spill-per-node设得太小,或 spill 路径 I/O 不达标(比如用了 NFS)
别忽略 width 和 Partitions 这两个隐性指标
EXPLAIN (ANALYZE) 中 WindowAgg 节点的 width 值超过 1000 字节,或 Partitions 数量超过 10 万,都是危险前兆——哪怕还没报错。
-
width大,说明每行缓存字段太多(比如误把jsonb或全文本列拖进窗口计算) -
Partitions过多,常见于按user_id或毫秒时间戳分区,引擎要维护上百万个微型排序上下文 - 这两项不直接导致溢出,但会让
work_mem或单节点内存迅速见顶,是比报错更早的预警信号
Sort Method: external merge Disk 和 Spilled Data 这类明确落盘标识最容易捕捉,但真正难处理的是那些 width 异常高、Partitions 碎片化严重却尚未触发报错的查询——它们正在 quietly 吞噬内存资源,直到某次数据量微增就突然崩掉。










