Cloudflare D1では、結果サイズが50 MBを超えるクエリは、2026年11月4日からエラーになります。開発者にとって重要なのは、この変更が適用される範囲です。制限されるのは個々のクエリ結果のサイズであり、データベースの最大サイズではありません。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を保存できます。
この2つは別の階層の制限です。ストレージはデータベースに保存できるデータ量を定め、結果サイズの上限は1つのクエリが返せるデータ量を定めます。そのため、データベースに50 MBを大きく超えるデータが保存されていても、分割して読み取れば利用できます。一方、データベースが小さくても、幅の広い行を大量に選択したり、大きなテキストやバイナリのフィールドを取得したりすれば、クエリ結果が制限を超えることがあります。
Cloudflareの制限発表によると、この上限はD1クエリの99.999パーセンタイルをカバーしています。これはプロバイダーが示したクエリ分布の評価です。実際のアプリケーションで確認するには、個々の応答を測定し、大量のデータを返すクエリを特定することが重要です。
REST API経由のエクスポートが別扱いなのはなぜ?
アプリケーションのクエリは通常、SQLの実行結果を取得して、呼び出し元のコードに渡します。REST API経由のデータベースのインポートとエクスポートは、これとは別の操作です。Cloudflareは、これらが新たな上限の対象ではなく、従来どおり利用できると明記しています。つまり、大きなクエリでエラーが起きても、データベースから大量のデータをエクスポートできなくなるわけではありません。

この違いを踏まえると、目的に応じて適切な方法を選べます。画面表示、処理、レポート作成のためにアプリケーションがすべてのレコードを必要とする場合は、読み取りを複数のバッチに分けます。データの移行やエクスポートが目的なら、データベース全体を1つのSQL応答で取得しようとせず、REST API経由のエクスポートを検討してください。
必要なデータを失わずに応答を小さくする方法
まず、不要な列を取り除きます。SELECT *の代わりに、現在の処理で必要なフィールドだけを指定してください。テーブルに長い説明文、JSON、BLOB値が含まれている場合は、特に応答サイズを削減できます。
次に、Cloudflareが推奨するように、LIMITとOFFSETを使って行を分割して読み取ります。たとえば、画面のスクロールに応じて次のページを取得したり、バッチ処理で各部分を個別に処理したりできます。固有の識別子などを使い、安定した並べ替えを行ってください。そうしないと、クエリの間にデータが変更された際にページの境界がずれることがあります。
長時間にわたるエクスポートでは、最後に処理したレコードのチェックポイントも保存するとよいでしょう。そうすれば、障害後にデータセット全体を再処理せずに作業を再開できます。具体的な方法はアプリケーションによって異なりますが、重要なのは、データセット全体を返す単一のクエリに頼らず、各応答のサイズを制限することです。
アプリケーションで確認すべきこと
まず、レポート用のエクスポート、管理画面、バックグラウンドタスク、複数行の配列を返すAPIルートなど、大量のデータを返すクエリを調べてください。一時的に、シリアライズ後の応答サイズ、または選択したフィールドの数とサイズを記録します。そのうえで、普段の小規模なテストデータだけでなく、想定される最大のデータ量も確認してください。
変更後にアプリケーションでエラーが発生した場合、D1のドキュメントでは、原因を50 MBを超える結果とし、必要な列だけを選ぶか、結果をページに分割するよう勧めています。これにより、応答サイズの問題と、実行時間、メモリ、データベースの可用性に関する制限を区別できます。これらはそれぞれ、異なるエラーと原因を持ちます。
チームにとっての結論はシンプルです。通常の小規模なクエリは変更が不要と考えられますが、大規模な読み取りは複数のバッチに分けて処理する方法に切り替えるのがよいでしょう。この上限があっても、より大きなデータベースを保存したり、REST API経由でエクスポートしたりすることは可能です。必要なのは、単一の応答が50 MB以内に収まるようにクエリを設計することです。