テック技報最新号へ →
インフラ

D1: 2026-11-04 からクエリ結果の上限 50 MB が強制される

2026 年 11 月 4 日(水)から、D1 で 1 回のクエリが返す結果が 50 MB を超えるとエラーで失敗するようになる。

@CFchangelog · 投稿 2026-10-30

どんなときに影響する?

  • 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

対策

  1. 必要な列だけ選ぶ。 SELECT * をやめて、一覧では大きい列を外す。
sql
-- 一覧: 本文は取らない
SELECT id, title, updated_at FROM posts ORDER BY id LIMIT 100 OFFSET 0;
-- 詳細: 1 件だけ本文を取る
SELECT body FROM posts WHERE id = ?;
  1. ページングする。 公式は LIMIT / OFFSET を例に挙げている。件数が多いテーブルでは、OFFSET が深くなるほど読み飛ばす行が増えるので、WHERE id > ? ORDER BY id LIMIT 100 のようなキーセット方式も検討する(こちらは筆者の補足)。
  2. 集計は SQL 側で。 全件を Worker に持ってきて数えるのではなく COUNT / GROUP BY で D1 に計算させる。
  3. 大きなバイナリは R2 へ。 BLOB を D1 に入れているなら、R2 に置いてキーだけ D1 に持つ構成にすると結果サイズも行サイズも小さくなる。

注意点

  • REST API 経由のインポート / エクスポートはこの上限の対象外で、今まで通り動く。バックアップ用途の全件エクスポートは影響を受けない。
  • 結果が 50 MB 近いクエリは、上限に関係なく Worker のメモリ(128 MB)も圧迫する。早めに分割しておくのが無難。

関連

出典

X の元の投稿を開く