Cloudflare 的 workerd 发布了 v1.20261029.1,改动列表里有一条很不起眼但值得关注:把 SQLITE_LIMIT_VDBE_OP 从 25000 提到 250000。
这个参数是什么
SQLite 的 VDBE 是它的虚拟机,一条 SQL 会被编译成一串虚拟机指令。VDBE_OP 限制的是单条语句可以执行的指令数,本质是防止一条查询把 CPU 吃光的保护性上限。默认值 25000 对普通 OLTP 查询绰绰有余,但在两种情况下会撞墙:一是带复杂子查询或大量 OR 条件的分析型 SQL,二是需要排序大量行的语句,因为排序会展开成大量指令。
为什么提到 250000
在 Durable Objects 或 Workers 里跑 SQLite 的场景在变重。原来只是存一点状态,现在有人在里面跑聚合、算报表、做全文检索。上限太低的表现是 statement too large 或直接超限报错,而且报错信息不够直白,容易被误判成数据量问题。提高十倍等于把这条隐形的墙往后推。
代价要清楚
上限提高意味着单条语句可能占用更多 CPU 时间。在按 CPU 计费、有执行时限的运行时里,这会把「查询被拦」换成了「查询超时」。所以提高上限不是免费的,实际写法上仍然应该:把大聚合拆成多条小查询、给排序字段建索引、能靠索引范围扫描就别全表排序。
同一版本里另外两条值得看的修复
formData() 在配合 TypeScript streams 时会损坏二进制分段,现在修了;还有一条是 TypeScript stream 的 pump 被丢弃时,排队中的流要正确取消。这两个都跟 Web 标准 API 在 Workers 里的实现细节有关,做文件上传和流式代理的人受影响最直接。另外 Temporal 现在与 Date.now() 使用同一时间源,行为更一致。
本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。