觀點 · 資訊分享
Cloudflare D1 免費方案 9 月 1 日起超量就失敗:每天讀 500 萬列、寫 10 萬列,用完要等 UTC 午夜
Cloudflare 宣布從 9 月 1 日起,Workers 免費方案的 D1 查詢,超過每日讀取或寫入列數上限就會直接失敗,直到 UTC 午夜重置。資料不受影響,但小專案要先檢查有沒有會全表掃描的查詢。
- 發布
- 2026-09-02
- 篇幅
- 約 4 分鐘 · 1,649 字
- 結構
- 8 節 + 4 題常見問題
- 標籤

一句話看懂:Cloudflare D1 免費方案從 9 月 1 日起,每天讀取或寫入超過上限,查詢就會直接失敗,要等到 UTC 午夜才重置;用 D1 做小專案的人要先檢查用量。

先用白話講:D1 是什麼?「列數限額」又是什麼?
D1 是 Cloudflare 的資料庫服務,很多人用它搭配 Workers 做小網站、小工具,免費方案就能開始玩。
它不是用「查詢幾次」來算量,而是用「讀了幾列資料」。想像你去圖書館找書:不管最後只借走一本,管理員都按你「翻過幾本書」來計費。如果書架沒有分類(沒有索引),你得從頭翻到尾,翻過的每一本都算數。
發生什麼事
Cloudflare 在 9 月 1 日的更新日誌寫道:從這天起,Workers 免費方案的 D1 查詢,只要帳號超過每日讀取列數或寫入列數上限,就會直接失敗。
- 透過 Workers 綁定與 REST API 發出的查詢,都會回傳錯誤,直到 UTC 午夜重置
- 儲存的資料不受影響
- 達到每日上限時,會收到電子郵件通知
- UTC 午夜相當於台灣時間早上 8 點(自行換算)
額度是多少?
依 D1 定價頁:
| 指標 | Workers 免費 | Workers Paid |
|---|---|---|
| 讀取列數 | 每天 500 萬 | 每月前 250 億列包含,超出每百萬列 0.001 美元 |
| 寫入列數 | 每天 10 萬 | 每月前 5000 萬列包含,超出每百萬列 1.00 美元 |
| 儲存空間 | 總共 5 GB | 前 5 GB 包含,超出每 GB 每月 0.75 美元 |
為什麼要小心「全表掃描」?
官方文件的例子:一張 5000 列的表,做一次全表掃描,就算 5000 列讀取。如果用沒有索引的欄位過濾,即使只回傳幾列給你的 Worker,資料庫仍然要掃描更多列才能找到答案,這些都算讀取。
假設你的小網站每次請求都對一張 1 萬列的表做全表掃描:每天只要 500 次請求,就會用掉 500 萬列的讀取額度(自行換算)。所以光是替常用的查詢欄位加上索引,就可能讓額度用量差很多倍。
給開發者的技術細節
官方建議的檢查方式:
- 在查詢結果的
meta物件看rows_read與rows_written - 用 GraphQL Analytics API,或儀表板的 Metrics > Row Metrics 檢視資料庫用量
- 官方說在限額開始執行前,就先檢視資料庫的查詢活動,找出可能超額的查詢
- 對資料表加索引,並檢查有沒有全表掃描
- 優化後仍不夠用,再升級 Workers Paid
const { meta } = await env.DB.prepare("SELECT * FROM posts WHERE slug = ?")
.bind(slug)
.run();
console.log(meta.rows_read, meta.rows_written);
另外,程式也要能處理「額度用盡」的錯誤:官方給的錯誤訊息是 Your account has exceeded D1’s free tier daily row read limit,建議在呼叫端捕捉,並顯示友善的錯誤頁面,而不是整個站掛掉。
我的看法
我自己做的小工具,不少是用免費方案撐著的,所以這種「額度變成硬限制」的消息我很有感。真正容易踩雷的是沒加索引的查詢,平常流量小看不出來,一旦有爬蟲或突然的人潮,額度就在一天內燒光。
如果你是幫客戶做小型網站,建議在交付前加一個檢查:把最常用的幾個查詢跑一遍,看 rows_read 是不是大到不合理;同時在文件裡寫清楚「免費額度用完會怎樣」,讓客戶知道哪天要升級。
名詞小辭典
- D1:Cloudflare 提供的 SQL 資料庫服務,可與 Workers 搭配使用。
- 索引(Index):資料庫的「目錄」,讓查詢不用從頭翻到尾。
- 全表掃描:沒有索引可用時,資料庫把整張表逐列檢查一次。
- UTC:世界協調時間,台灣時間比 UTC 快 8 小時。