D1 자주 묻는 질문 (FAQs)
Cloudflare D1의 요금, 제한 사항, 사용 방식에 대해 자주 묻는 질문과 답변을 모아봤어요. D1을 처음 시작하거나 비용을 예측하고 싶을 때, 그리고 제한에 부딪혔을 때 이 페이지를 참고하면 대부분 해결돼요.
출처: 문서
본문
FAQs
요금 (Pricing)
D1은 항상 무료 플랜(Free plan)이 있나요?
네, Workers 무료 플랜에는 항상 D1을 무료로 프로토타입하고 실험해볼 수 있는 기능이 포함돼요.
무료 플랜에서 일일 읽기·쓰기 한도나 총 저장 용량 한도를 초과하면 어떻게 되나요?
계정이 일일 읽기 및/또는 쓰기 한도에 도달하면 D1에 쿼리를 실행할 수 없게 돼요. D1 API가 일일 한도를 초과했다는 오류를 클라이언트에 반환하거든요. 포함된 저장 용량 한도에 도달하면 새 데이터를 삽입하거나 테이블을 생성·변경하거나 인덱스·트리거를 만들기 전에 사용하지 않는 데이터베이스를 삭제하거나 오래된 데이터를 정리해야 해요.
Workers 유료 플랜(Paid plan)으로 업그레이드하면 이런 제한이 보통 몇 분 안에 사라져요.
유료 티어에서 월간 포함된 읽기·쓰기 및/또는 저장 용량을 초과하면 어떻게 되나요?
초과한 읽기·쓰기·저장 용량에 대해 D1 요금 지표에 따라 추가 비용이 청구돼요.
(예상) 청구 금액을 어떻게 추정할 수 있나요?
모든 쿼리는 그 쿼리가 읽은 행 수(rows_read)와 쓴 행 수(rows_written)의 총합을 담은 meta 객체를 반환해요. 예를 들어 5000행짜리 테이블에서 전체 테이블 스캔(예: SELECT * FROM users)을 수행하는 쿼리는 rows_read 값으로 5000을 반환해요:
"meta": {
"duration": 0.20472300052642825,
"size_after": 45137920,
"rows_read": 5000,
"rows_written": 0
}
이 값들은 D1 Cloudflare 대시보드 ↗︎와 분석 API에도 포함되어, 특정 데이터베이스·시간대 또는 둘 다에 읽기·쓰기 볼륨을 귀속시킬 수 있어요.
D1은 데이터 전송/이그레스(egress) 비용을 청구하나요?
아니요.
D1은 추가 컴퓨팅 비용을 청구하나요?
D1 자체는 추가 컴퓨팅 비용을 청구하지 않아요. 결과를 JSON으로 직렬화하거나 쿼리를 실행하는 등 D1을 쿼리하고 결과를 계산하는 Workers는 D1 사용량과 별도로 Workers 요금에 따라 청구돼요.
대시보드나 Wrangler(CLI)에서 실행한 쿼리도 청구 대상 사용량으로 집계되나요?
네. 새 데이터베이스에 기존 데이터를 삽입하는(INSERT) 것, 테이블 스캔(SELECT * FROM table), 인덱스 생성 등 데이터베이스에 대해 실행하는 모든 쿼리는 읽기 또는 쓰기로 집계돼요.
인덱스를 사용해 쿼리가 읽는 행 수를 줄일 수 있나요?
네, 인덱스를 사용해 쿼리가 읽는 행 수를 줄일 수 있어요. 가장 많이 쿼리하는 테이블과 필터링하는 컬럼에 인덱스를 생성하면 스캔하는 데이터 양이 줄어들고 동시에 쿼리 성능도 좋아져요. 읽기 위주(read-heavy) 워크로드(가장 흔한 경우)라면 특히 유리해요. 인덱스에 포함된 컬럼에 쓰면 인덱스 업데이트를 반영하기 위해 추가 행이 최소 1개 더 쓰이지만, 보통 인덱스 덕분에 읽는 행 수가 줄어드는 이점으로 상쇄돼요.
새로 만든 데이터베이스나 행이 없는 빈 테이블도 저장 용량에 포함되나요?
네, 아주 적지만 포함돼요. 빈 테이블은 테이블의 컬럼 수(테이블 폭)에 따라 최소 수 킬로바이트를 소모해요. 빈 데이터베이스는 약 12 KB의 저장 공간을 소모해요.
제한 사항 (Limits)
D1 데이터베이스는 얼마나 많은 작업을 처리할 수 있나요?
D1은 사용자별·테넌트별·엔티티별 데이터베이스처럼 여러 개의 작은(10 GB) 데이터베이스로 수평 확장하도록 설계돼요. D1은 쿼리와 저장 비용만 기준으로 요금이 책정되므로, 추가 비용 없이 수천 개의 데이터베이스로 애플리케이션을 구축할 수 있게 해줘요.
저장 용량 (Storage)
각 D1 데이터베이스는 최대 10 GB의 데이터를 저장할 수 있어요.
동시성과 처리량 (Concurrency and throughput)
개별 D1 데이터베이스는 기본적으로 단일 스레드라서 쿼리를 한 번에 하나씩 처리해요.
최대 처리량은 쿼리 지속 시간과 직접적인 관련이 있어요.
-
평균 쿼리가 1 ms가 걸리면 초당 약 1,000개의 쿼리를 실행할 수 있어요.
-
평균 쿼리가 100 ms가 걸리면 초당 10개의 쿼리를 실행할 수 있어요.
동시 요청이 너무 많은 데이터베이스는 먼저 큐에 넣으려고 시도해요. 큐가 가득 차면 데이터베이스는 "overloaded" 오류를 반환해요.
개별 D1 데이터베이스는 단일 Durable Object로 뒷받침돼요. D1 읽기 복제 ↗︎를 사용할 때 각 복제본 인스턴스는 서로 다른 Durable Object이며, 이 지침은 각 복제본 인스턴스에 독립적으로 적용돼요.
쿼리 성능 (Query performance)
쿼리 성능은 처리량에 가장 중요한 요소예요. 대략적인 기준은 다음과 같아요.
-
id에 적절한 인덱스가 있는SELECT name FROM users WHERE id = ?같은 읽기 쿼리는 SQL 지속 시간이 1밀리초 미만으로 걸려요. -
INSERT나UPDATE같은 쓰기 쿼리는 SQL 지속 시간이 수 밀리초가 걸릴 수 있고, 쓰는 행 수에 따라 달라져요. 쓰기는 여러 위치에 영구적으로 지속되어야 해요 - D1이 내부적으로 데이터를 어떻게 지속하는지 ↗︎에서 자세히 알아보세요. -
수백만 행에 영향을 주는 대규모
UPDATE나DELETE같은 데이터 마이그레이션은 배치로 실행해야 해요. 한 번에 수십만 행이나 수백 MB의 데이터를 수정하려는 단일 쿼리는 실행 한도를 초과해요. 작업을 더 작은 덩어리(예: 한 번에 1,000행씩 처리)로 나눠 플랫폼 한도 내에서 유지해야 해요.
쿼리가 빠르고 효율적으로 실행되도록 SQL 스키마에 적절한 인덱스를 사용하세요.
CPU와 메모리
쿼리 실행과 결과 직렬화를 포함한 D1 데이터베이스의 작업은 Workers 플랫폼 CPU·메모리 한도 내에서 실행돼요.
이 한도를 초과하거나 다른 플랫폼 한도에 부딪히면 오류가 발생해요. 자세한 내용은 D1 오류 목록을 참조하세요.
Worker가 D1에 동시에 몇 개의 연결을 열 수 있나요?
Worker 호출마다 D1에 최대 6개의 연결을 동시에 열 수 있어요.
Worker의 동시 연결에 대한 자세한 내용은 동시 열린 연결 (Simultaneous open connections)을 참조하세요.