自 2026 年 11 月 4 日起,向 Cloudflare D1 发起的查询若返回超过 50 MB 的结果,就会报错。开发者需要注意这项变更的边界:限制针对单次查询结果的大小,而非数据库的最大容量。通过 REST API 导入和导出不受此限制,因此是否需要调整工作流程,取决于读取数据的方式。

具体限制了什么?
Cloudflare 在 10 月 30 日发布的说明中称,结果超过 50 MB 的查询会返回错误 D1 query result exceeded the maximum response size limit of 50 MB。该限制自 2026 年 11 月 4 日起生效。D1 文档也将其列为查询结果大小限制;与此同时,付费方案的数据库容量最高可达 10 GB,免费方案则为 500 MB。
这属于不同层面:存储容量规定数据库能容纳多少数据,结果限制则规定单次查询最多能返回多少数据。因此,数据库可以存储远超 50 MB 的数据,并且仍可分批读取。另一方面,即使数据库很小,如果查询选择了大量宽行或大型文本、二进制字段,也可能超过限制。
在Cloudflare 关于该限制的公告中,公司表示这一阈值涵盖了 D1 查询的第 99.999 百分位。这是供应商提供的查询分布估算;对于应用层面的验证,更重要的是测量实际响应,并找出会返回大型数据集的查询。
为什么通过 REST API 导出是另一回事?
应用查询通常会获取 SQL 执行结果,再将其交给调用代码。通过 REST API 导入和导出数据库则是不同的操作:Cloudflare 特别指出,这些操作不受新阈值限制,仍按原方式运行。因此,大型查询报错并不意味着无法从数据库导出大量数据。

实际操作中,理解这一区别有助于选择正确的方式。如果应用需要获取所有记录以供展示、处理或生成报告,就应分批读取。如果目的是迁移或导出数据,应检查通过 REST API 导出的方案,而不是试图用一条 SQL 响应获取整个数据库。
如何缩小响应,同时保留所需数据?
第一步是去掉不需要的列。不要使用 SELECT *,而应只选择当前操作所需的字段。如果表中包含长篇描述、JSON 或 BLOB 值,这样尤其能减少响应体积。
第二步是按照 Cloudflare 的建议,使用 LIMIT 和 OFFSET 分批读取行。例如,界面可以在用户滚动时获取下一页,批处理任务则可以逐批处理数据。还应加入稳定的排序,例如按唯一标识符排序:如果数据在请求之间发生变化而没有排序,分页边界就可能移动。
对于耗时较长的导出任务,还可以保存最后一条已处理记录的检查点。这样,任务发生故障后即可继续执行,无须重新处理整个数据集。具体方案取决于应用;关键原则是限制每次响应的大小,而不是依赖一条返回整个数据集的查询。
应用中需要检查什么
首先检查会返回大量记录的查询:报告导出、管理界面、后台任务,以及返回行数组的 API 路由。可以暂时记录序列化响应的体积,或所选字段的数量和大小。随后应检查预期的最大数据量,而不能只依赖测试数据中通常较小的样本。
如果应用在变更生效后报错,D1 文档将此类错误与结果超过 50 MB 联系起来,并建议只选择必要列或对结果分页。这样便能将响应体积问题与执行时间、内存或数据库可用性限制区分开来:那些问题有不同的错误和成因。
对团队来说,结论很简单:普通的短查询可能无需调整,而大型读取应改为分批处理。此限制并不妨碍存储更大的数据库,也不会阻止通过 REST API 导出;它要求的是合理设计查询,确保单次响应不超过 50 MB。