D1: 2026-11-04 からクエリ結果の上限 50 MB が強制される
2026 年 11 月 4 日(水)から、D1 で 1 回のクエリが返す結果が 50 MB を超えるとエラーで失敗するようになる。
どんなときに影響する?
SELECT *で大きな TEXT / BLOB 列(本文、JSON、画像の Base64 など)ごと全件を取っている- 管理画面やバッチで「テーブル全部を 1 回で読む」処理がある
- Worker から集計前の生データをまとめて取り、JS 側で絞り込んでいる
Cloudflare によると 50 MB は D1 全体のリクエストの 99.999 パーセンタイルをカバーするので、多くの利用者には関係ない。ただし上の書き方をしているなら施行日までに確認しておく。
超えたときのエラー
D1 query result exceeded the maximum response size limit of 50 MB対策
- 必要な列だけ選ぶ。
SELECT *をやめて、一覧では大きい列を外す。
sql
-- 一覧: 本文は取らない
SELECT id, title, updated_at FROM posts ORDER BY id LIMIT 100 OFFSET 0;
-- 詳細: 1 件だけ本文を取る
SELECT body FROM posts WHERE id = ?;- ページングする。 公式は
LIMIT/OFFSETを例に挙げている。件数が多いテーブルでは、OFFSETが深くなるほど読み飛ばす行が増えるので、WHERE id > ? ORDER BY id LIMIT 100のようなキーセット方式も検討する(こちらは筆者の補足)。 - 集計は SQL 側で。 全件を Worker に持ってきて数えるのではなく
COUNT/GROUP BYで D1 に計算させる。 - 大きなバイナリは R2 へ。 BLOB を D1 に入れているなら、R2 に置いてキーだけ D1 に持つ構成にすると結果サイズも行サイズも小さくなる。
注意点
- REST API 経由のインポート / エクスポートはこの上限の対象外で、今まで通り動く。バックアップ用途の全件エクスポートは影響を受けない。
- 結果が 50 MB 近いクエリは、上限に関係なく Worker のメモリ(128 MB)も圧迫する。早めに分割しておくのが無難。