Aurora DSQL의 청구 방식
Amazon Aurora DSQL은 선결제 비용 없이 사용한 만큼만 비용을 지불하면 됩니다. 이 섹션에서는 Aurora DSQL이 데이터베이스 활동을 측정하고 이를 AWS 청구서의 요금으로 변환하는 방법을 설명합니다. 리전별 현재 요금은 Aurora DSQL 요금 페이지
주제
측정 방식
프로비저닝된 용량에 대해 요금을 부과하는 기존 데이터베이스와 달리 Aurora DSQL은 수행된 실제 작업에 대해서만 요금을 부과합니다. Aurora DSQL은 분산 처리 장치(DPU)로 측정되는 데이터베이스 활동과 월당 GiB로 측정되는 스토리지라는 두 가지 기본 구성 요소를 측정합니다.
DPU는 시스템이 SQL 워크로드를 실행하는 데 필요한 작업량을 측정하며, 단일 리전 클러스터의 경우 컴퓨팅 DPU, 읽기 DPU, 쓰기 DPU의 세 가지 구성 요소로 이루어져 있습니다. 다중 리전 클러스터에서는 다중 리전 쓰기 DPU 구성 요소가 추가로 발생합니다. 자세한 내용은 다중 리전 청구를 참조하세요.
다음 표에는 Aurora DSQL이 데이터베이스 활동을 측정하는 데 사용하는 구성 요소가 요약되어 있습니다. 청구서에는 각 개별 구성 요소의 합계인 DPU와 스토리지에 대한 두 개의 행 항목만 표시됩니다.
| 측정 단위 | 활동 유형 | 측정 |
|---|---|---|
| 컴퓨팅 DPU | 쿼리 처리 | CPU 시간 |
| 읽기 DPU | 데이터베이스에서 데이터 읽기 | 스토리지에서 읽은 바이트 수 |
| 쓰기 DPU | 데이터베이스에 데이터 쓰기 | 스토리지에 기록된 바이트 수 |
| 스토리지 | 테이블 스토리지 | GiB-월 |
DPU 구성 요소 측정 설명
Aurora DSQL은 모든 트랜잭션에 대해 컴퓨팅 DPU, 읽기 DPU, 쓰기 DPU라는 세 가지 구성 요소의 합계로 총 DPU를 계산합니다. 다음 섹션에서는 Aurora DSQL이 각 구성 요소를 측정하는 방법을 설명합니다.
Total DPU = ComputeDPU + ReadDPU + WriteDPU
컴퓨팅 DPU
컴퓨팅 DPU는 조인, 함수, 집계, 정렬, 쿼리 계획을 포함하여 쿼리를 실행하는 데 소요된 총 처리 시간을 사용하여 측정됩니다. 쿼리의 일부를 병렬로 처리할 수 있으므로 컴퓨팅 DPU는 쿼리의 실제 실행 시간이 아닌 모든 처리 시간의 합계를 반영합니다.
다음 공식은 컴퓨팅 DPU 계산 방법을 요약한 것입니다.
ComputeDPU = Total Compute time (in seconds)
쓰기 DPU
Aurora DSQL은 모든 트랜잭션에 대해 스토리지에 기록된 총 바이트를 기준으로 쓰기 DPU를 측정합니다. 쓰기 DPU에는 기본 테이블과 보조 인덱스에 기록된 총 데이터가 모두 포함됩니다. Aurora DSQL은 기본 테이블과 보조 인덱스에 기록된 각 행의 크기가 128바이트보다 작더라도 128바이트로 간주하여 요금을 부과합니다. 또한 1,024바이트 미만의 데이터를 기록하는 쓰기 트랜잭션도 1,024바이트를 기록한 것처럼 요금을 부과합니다.
참고
Aurora DSQL은 쓰기 전에 고유성을 확인하기 위해 프라이머리 키 인덱스를 읽기 때문에 쓰기 작업 시에도 읽기 DPU 요금이 발생합니다.
다음 공식들은 쓰기 DPU를 계산하는 단계를 보여줍니다.
1단계: 기록된 바이트 수 계산
Bytes Written = Sum of max(size of each row, 128 bytes) for all rows written
2단계: 쓰기 DPU 계산
WriteDPU = max(Bytes Written, 1024) × 0.00004883
읽기 DPU
Aurora DSQL은 모든 트랜잭션에 대해 스토리지에서 읽은 총 바이트를 기준으로 읽기 DPU를 측정합니다. 읽기 DPU에는 기본 테이블과 보조 인덱스에서 읽은 데이터가 모두 포함됩니다.
파티션당 최소값: Aurora DSQL은 행이 아닌 스토리지 파티션 단위로 읽기 바이트 수를 측정합니다. 스토리지 파티션에 대한 읽기 요청 결과가 128바이트 미만인 경우, Aurora DSQL은 이를 128바이트로 반올림합니다. 예를 들어 쿼리가 4개의 파티션에서 읽는 경우(한 파티션에서 200바이트, 나머지 세 파티션에서 각각 50바이트), 50바이트 읽기 3개는 각각 128바이트로 반올림되어 총 200 + 128 + 128 + 128 = 584바이트가 청구됩니다.
트랜잭션 최소값: Aurora DSQL은 총 2,048바이트 미만의 데이터를 읽는 읽기 트랜잭션도 2,048바이트를 읽은 것처럼 요금을 청구합니다.
다음 공식들은 읽기 DPU를 계산하는 단계를 보여줍니다.
1단계: 읽은 바이트 수 계산
Bytes Read = # of rows read × size of each row
참고
실제로 읽는 바이트 수는 데이터가 스토리지 파티션에 어떻게 분산되어 있는지에 따라 달라집니다. 파티션당 최소값인 128바이트가 파티션별로 적용되기 때문입니다. 모든 행 크기가 128바이트를 초과하는 경우 읽은 행 수에 각 행의 크기를 곱하면 됩니다.
2단계: 읽기 DPU 계산
ReadDPU = max(Bytes Read, 2048) × 0.00000183105
결제 예제
다음 예제에서는 Aurora DSQL이 일반적인 작업에 대한 DPU를 계산하는 방법을 보여줍니다. 이 예제의 비용 값은 us-east-1 리전 요금을 기준으로 합니다. 다른 리전의 요금은 Aurora DSQL 요금 페이지
이 예제는 트랜잭션 최소값이 적용되는 포인트 조회 읽기 DPU 계산을 보여줍니다.
스키마:
CREATE TABLE orders ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), customer_id VARCHAR(50) NOT NULL, order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, total_amount DECIMAL(10,2), status VARCHAR(20) ); -- Average row size: ~100 bytes
{Query}
SELECT * FROM orders WHERE customer_id = 'cust-12345';
시나리오: 쿼리는 각각 약 100바이트 크기인 5개의 행을 반환합니다. 모든 행이 하나의 스토리지 파티션에 있다고 가정하면, 읽는 총 바이트 수는 5 × 100 = 500바이트입니다. 500바이트는 파티션당 최소값인 128바이트를 초과하므로 계산 시 파티션당 최소값이 적용되지 않습니다.
읽기 DPU 계산:
ReadDPU = max(500, 2048) × 0.00000183105 = 2048 × 0.00000183105 = 0.00375
500바이트는 2,048바이트 미만이므로 트랜잭션 최소값 2,048바이트가 적용됩니다.
총 트랜잭션 비용:
쿼리 실행 시간을 3ms(0.003초)로 가정하면 다음과 같습니다.
ComputeDPU: 0.003 ReadDPU: 0.00375 WriteDPU: 0.0 ------------------- Total DPU: 0.00675
스키마:
CREATE TABLE orders ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), customer_id VARCHAR(50) NOT NULL, order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, total_amount DECIMAL(10,2), status VARCHAR(20) ); -- Average row size: ~100 bytes -- Table contains 100 orders for customer 'cust-12345'
{Query}
SELECT * FROM orders WHERE customer_id = 'cust-12345' AND total_amount > 500.00;
시나리오: 쿼리는 100개의 행에서 고객 'cust-12345'를 스캔하지만 total_amount > 500.00 필터로 인해 결과가 10개의 행으로 줄어듭니다. Aurora DSQL은 스캔한 100개 행 모두에 대해 요금을 청구합니다. 모든 행이 하나의 스토리지 파티션에 있다고 가정하면, 읽는 총 바이트 수는 100 × 100 = 10,000바이트입니다.
읽기 DPU 계산:
ReadDPU = max(10000, 2048) × 0.00000183105 = 10000 × 0.00000183105 = 0.01831
10,000바이트는 트랜잭션 최소값인 2,048바이트를 초과하므로 실제로 읽은 바이트 수가 사용됩니다.
총 트랜잭션 비용:
쿼리 실행 시간을 8ms(0.008초)로 가정하면 다음과 같습니다.
ComputeDPU: 0.008 ReadDPU: 0.01831 WriteDPU: 0.0 ------------------- Total DPU: 0.02631
중요
ReadDPU 비용을 최소화하기 위해서는 필요한 행만 스캔하도록 쿼리와 인덱스를 설계해야 합니다. 이 예제에서 (customer_id, total_amount)에 인덱스를 추가하면 쿼리가 스캔하는 행 수를 줄일 수 있습니다.
스키마:
CREATE TABLE orders ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), customer_id VARCHAR(50) NOT NULL, order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, total_amount DECIMAL(10,2), status VARCHAR(20) ); -- Average row size: ~100 bytes
{Query}
INSERT INTO orders (customer_id, total_amount, status) VALUES ('cust-67890', 150.00, 'pending');
시나리오: 약 100바이트 크기의 행 1개를 삽입합니다.
쓰기 DPU 계산:
1단계 - 기록된 바이트 수 계산:
1 row × max(100 bytes, 128 bytes) = 1 × 128 = 128 bytes
2단계 - 쓰기 DPU 계산:
WriteDPU = max(128, 1024) × 0.00004883 = 1024 × 0.00004883 = 0.05
128바이트는 1,024바이트 미만이므로 트랜잭션 최소값 1,024바이트가 적용됩니다.
읽기 DPU(프라이머리 키 확인):
Aurora DSQL은 쓰기 전에 고유성을 확인하기 위해 프라이머리 키 인덱스를 읽습니다. 이로 인해 트랜잭션 최소 읽기 요금이 발생합니다.
ReadDPU = 0.00375 (transaction minimum)
총 트랜잭션 비용:
쿼리 실행 시간을 8ms(0.008초)로 가정하면 다음과 같습니다.
ComputeDPU: 0.008 ReadDPU: 0.00375 WriteDPU: 0.05 ------------------- Total DPU: 0.06175
스키마:
CREATE TABLE orders ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), customer_id VARCHAR(50) NOT NULL, order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, total_amount DECIMAL(10,2), status VARCHAR(20) ); -- Average row size: ~100 bytes
{Query}
INSERT INTO orders (customer_id, total_amount, status) VALUES ('cust-001', 100.00, 'pending'), ('cust-002', 150.00, 'pending'), ... -- 100 rows total ('cust-100', 200.00, 'pending');
시나리오: 각각 약 100바이트 크기의 행 100개를 삽입합니다.
쓰기 DPU 계산:
1단계 - 기록된 바이트 수 계산:
100 rows × max(100 bytes, 128 bytes) = 100 × 128 = 12,800 bytes
2단계 - 쓰기 DPU 계산:
WriteDPU = max(12800, 1024) × 0.00004883 = 12800 × 0.00004883 = 0.625
읽기 DPU(프라이머리 키 확인):
Aurora DSQL은 고유성을 확인하기 위해 프라이머리 키 인덱스를 읽습니다. 100개의 키 조회 데이터가 모두 하나의 스토리지 파티션에 있다고 가정하면, 읽는 총 바이트 수는 100 × 16바이트(UUID) = 1,600바이트입니다.
ReadDPU = max(1600, 2048) × 0.00000183105 = 2048 × 0.00000183105 = 0.00375
1,600바이트는 2,048바이트 미만이므로 트랜잭션 최소값 2,048바이트가 적용됩니다.
총 트랜잭션 비용:
쿼리 실행 시간을 80ms(0.08초)로 가정하면 다음과 같습니다.
ComputeDPU: 0.08 ReadDPU: 0.00375 WriteDPU: 0.625 ------------------- Total DPU: 0.70875
다중 리전 청구
다중 리전 클러스터에서는 표준 컴퓨팅, 읽기 및 쓰기 DPU 외에도 다중 리전 쓰기 DPU 구성 요소가 추가로 발생합니다. 이 섹션은 다중 리전 클러스터에만 적용됩니다. 단일 리전 클러스터에는 이 요금이 부과되지 않습니다.
다중 리전 쓰기 DPU는 피어링된 리전에 기록된 총 바이트 수를 측정합니다. Aurora DSQL은 피어링된 리전에 쓰는 데이터를 동기식으로 복제하므로 다중 리전 쓰기 DPU 값은 쓰기 DPU와 동일합니다. Aurora DSQL은 피어링된 리전이 아닌 쓰기가 시작된 리전에서 이 DPU 요금을 청구합니다.
MultiRegionWriteDPU = WriteDPU
CloudWatch를 사용한 DPU 사용량 모니터링
Aurora DSQL은 사용량 지표를 Amazon CloudWatch에 게시하므로 거의 실시간으로 사용량을 모니터링할 수 있습니다.
사용 가능한 DPU 지표
| CloudWatch 지표 | 설명 | 측정 기준 |
|---|---|---|
WriteDPU |
쓰기 사용량 구성 요소 | ClusterId |
ReadDPU |
읽기 사용량 구성 요소 | ClusterId |
ComputeDPU |
쿼리 처리 구성 요소 | ClusterId |
MultiRegionWriteDPU |
다중 리전 복제(다중 리전 클러스터에만 해당) | ClusterId |
TotalDPU |
모든 DPU 구성 요소의 합계 | ClusterId |
DPU 지표 보기
CloudWatch에서 DPU 지표를 보는 방법
-
지표, AuroraDSQL, ClusterId 순으로 이동합니다.
-
클러스터와 모니터링할 DPU 지표를 선택합니다.
작은 정보
일정 기간 동안의 총 사용량을 확인하려면 DPU 지표에 대한 합계 통계를 사용합니다. LAST 레이블을 추가하면 최신 값을 확인할 수 있습니다.
추가 관찰성 지표
Aurora DSQL 지표 및 모니터링 기능의 전체 목록은 Aurora DSQL 모니터링 및 로깅 섹션을 참조하세요.
| 지표 | 설명 |
|---|---|
ClusterStorageSize |
바이트 단위의 현재 스토리지 크기 |
TotalTransactions |
실행된 총 트랜잭션 수 |
ReadOnlyTransactions |
실행된 읽기 전용 트랜잭션 수 |
QueryTimeouts |
시간 제한을 초과한 쿼리 수 |
OccConflicts |
OCC 충돌로 인해 중단된 트랜잭션 수 |
BytesWritten |
스토리지에 기록된 원시 바이트 수 |
BytesRead |
스토리지에서 읽은 원시 바이트 수 |
비용 인식을 위한 EXPLAIN ANALYZE VERBOSE 사용
Aurora DSQL은 EXPLAIN ANALYZE VERBOSE를 확장하여 출력 끝에 문 수준의 DPU 사용량 추정치를 포함합니다. 이를 통해 쿼리 비용을 즉시 파악할 수 있으므로 워크로드 비용 동인을 식별하고 쿼리 성능을 조정하며 리소스 사용량을 더 잘 예측할 수 있습니다.
참고
DPU 추정치를 보려면 EXPLAIN ANALYZE VERBOSE(VERBOSE 포함)를 사용해야 합니다. VERBOSE 없이 일반 EXPLAIN ANALYZE를 실행하면 DPU 정보가 표시되지 않습니다.
예제 1: SELECT 쿼리
EXPLAIN ANALYZE VERBOSE SELECT * FROM test_table;
QUERY PLAN
----------------------------------------------------
Index Only Scan using test_table_pkey on public.test_table (cost=125100.05..171100.05 rows=1000000 width=36) (actual time=2.973..4.482 rows=120 loops=1)
Output: id, context
-> Storage Scan on test_table_pkey (cost=125100.05..171100.05 rows=1000000 width=36) (actual rows=120 loops=1)
Projections: id, context
-> B-Tree Scan on test_table_pkey (cost=125100.05..171100.05 rows=1000000 width=36) (actual rows=120 loops=1)
Query Identifier: qymgw1m77maoe
Planning Time: 11.415 ms
Execution Time: 4.528 ms
Statement DPU Estimate:
Compute: 0.01607 DPU
Read: 0.04312 DPU
Write: 0.00000 DPU
Total: 0.05919 DPU
이 예제에서 SELECT 문은 인덱스 전용 스캔을 수행하므로 대부분의 비용은 스토리지에서 검색된 데이터와 결과를 처리하고 반환하는 데 사용되는 컴퓨팅 리소스를 반영하는 컴퓨팅 DPU(0.01607)를 나타내는 읽기 DPU(0.04312)에서 발생합니다. 쿼리는 데이터를 수정하지 않으므로 쓰기 DPU가 없습니다. 총 DPU(0.05919)는 컴퓨팅 + 읽기 + 쓰기의 합계입니다.
예제 2: INSERT 쿼리
EXPLAIN ANALYZE VERBOSE INSERT INTO test_table VALUES (1, 'name1'), (2, 'name2'), (3, 'name3');
QUERY PLAN
----------------------------------------------------
Insert on public.test_table (cost=0.00..0.04 rows=0 width=0) (actual time=0.055..0.056 rows=0 loops=1)
-> Values Scan on "*VALUES*" (cost=0.00..0.04 rows=3 width=122) (actual time=0.003..0.008 rows=3 loops=1)
Output: "*VALUES*".column1, "*VALUES*".column2
Query Identifier: jtkjkexhjotbo
Planning Time: 0.068 ms
Execution Time: 0.543 ms
Statement DPU Estimate:
Compute: 0.01550 DPU
Read: 0.00307 DPU (Transaction minimum: 0.00375)
Write: 0.01875 DPU (Transaction minimum: 0.05000)
Total: 0.03732 DPU
이 문은 주로 쓰기를 수행하므로 대부분의 비용이 쓰기 DPU와 연결됩니다. 컴퓨팅 DPU(0.01550)는 값을 처리하고 삽입하기 위해 수행된 작업을 나타냅니다. 읽기 DPU(0.00307)는 마이너 시스템 읽기(카탈로그 조회 또는 인덱스 검사용)를 반영합니다.
읽기 및 쓰기 DPU 옆 괄호 안에 표시된 트랜잭션 최소값을 확인합니다. 이 최소값은 트랜잭션 수준에서 적용되므로 전체 트랜잭션의 총 읽기 또는 쓰기 DPU는 이 값보다 작을 수 없습니다. EXPLAIN ANALYZE VERBOSE를 사용하여 비용을 예측하며 트랜잭션에 이 문 하나만 있다면, 원시 문 추정치가 아닌 트랜잭션 최소값을 사용합니다. 트랜잭션에 여러 문이 포함된 경우 모든 문의 집계에 최소값이 적용됩니다. EXPLAIN ANALYZE VERBOSE는 문 수준 추정치를 보고하는 반면 청구는 트랜잭션 수준 최소값을 적용하므로, 값이 CloudWatch 지표 또는 청구 데이터와 정확히 일치하지 않을 수 있습니다.
최적화를 위한 DPU 정보 사용
문별 DPU 추정치는 실행 시간 이상으로 쿼리를 최적화할 수 있는 강력한 방법을 제공합니다. 일반적인 사용 사례는 다음과 같습니다.
-
비용 인식: 다른 쿼리에 비해 쿼리 비용이 얼마나 드는지 이해합니다.
-
스키마 최적화: 인덱스 또는 스키마 변경이 성능 및 리소스 효율성에 미치는 영향을 비교합니다.
-
예산 계획: 관찰된 DPU 사용량을 기준으로 워크로드 비용을 추정합니다.
-
쿼리 비교: 상대적 DPU 사용량을 기준으로 대체 쿼리 접근 방식을 평가합니다.
DPU 정보 해석
EXPLAIN ANALYZE
VERBOSE에서 DPU 데이터를 사용할 때는 다음 모범 사례를 염두에 두세요.
-
방향에 따라 사용: 보고된 DPU를 CloudWatch 지표 또는 결제 데이터와 정확히 일치하지 않고 쿼리의 상대 비용을 이해하는 방법으로 취급합니다.
EXPLAIN ANALYZE VERBOSE는 문 수준 비용을 보고하는 반면 CloudWatch는 트랜잭션 수준 활동을 집계하기 때문에 차이가 예상됩니다. CloudWatch에는EXPLAIN ANALYZE VERBOSE에서 의도적으로 제외되는 백그라운드 작업(예: 비동기식 ANALYZE 또는 압축) 및 트랜잭션 오버헤드(BEGIN/COMMIT)도 포함됩니다. -
개념 증명을 위해 대표 데이터로 테스트: 비용 평가를 위한 개념 증명을 실행할 때는 테이블에 예상되는 프로덕션 워크로드와 유사한 데이터 볼륨 및 분포가 포함되어 있는지 확인합니다. 비어 있거나 드문드문 채워진 테이블을 기반으로 하는 DPU 추정치는
EXPLAIN ANALYZE VERBOSE에서든 CloudWatch 지표에서든 실제 비용을 반영하지 않습니다. -
실행 간 DPU 변동성은 분산 시스템에서 정상이며 오류를 나타내지 않습니다. 캐싱, 실행 계획 변경, 동시성, 비동기식 ANALYZE 같은 백그라운드 작업 또는 데이터 분포 변화 등의 요인으로 인해 동일한 쿼리가 실행될 때마다 다른 리소스를 소비할 수 있습니다.
-
소규모 작업 배치 처리: 워크로드에서 여러 개의 작은 명령문을 실행하는 경우, 하나의 트랜잭션 내에서 더 큰 쓰기 작업으로 배치 처리하는 것이 좋습니다(읽기에는 5분간의 트랜잭션 제한 시간만 적용되지만 수정 작업은 트랜잭션당 10MB를 초과해서는 안 됨). 이렇게 하면 트랜잭션 최소값이 더 많은 작업에 분산되어 보다 의미 있는 비용 추정치를 얻을 수 있습니다.
-
결제가 아닌 튜닝에 사용:
EXPLAIN ANALYZE VERBOSE의 DPU 데이터는 비용 인식, 쿼리 튜닝 및 최적화를 위해 설계되었습니다. 결제 등급 지표가 아닙니다. 신뢰할 수 있는 비용 및 사용량 데이터는 항상 CloudWatch 지표 또는 월별 결제 보고서에 의존하세요.
비용 추정 모범 사례
-
최적화 전 모니터링: 최적화 결정을 내리기 전에 CloudWatch 지표를 사용하여 현재 사용 패턴을 이해합니다. 자세한 내용은 CloudWatch를 사용한 DPU 사용량 모니터링을 참조하세요.
-
트랜잭션 효율성에 집중: 트랜잭션 수준에서 최소 요금이 적용되므로 관련 작업을 함께 배치 처리하여 최소 요금 부담을 줄입니다.
-
개발 중에 EXPLAIN ANALYZE VERBOSE 사용: 개발 단계에서 중요한 쿼리에 대해
EXPLAIN ANALYZE VERBOSE를 실행하여 비용 특성을 파악합니다. 비용 평가를 위한 개념 증명을 실행할 때는 대표적인 데이터 볼륨과 분포를 가진 테이블을 대상으로 테스트합니다. 비어 있거나 드문드문 채워진 테이블을 기반으로 한 추정치는 실제 프로덕션 비용을 반영하지 않습니다. 자세한 내용은 비용 인식을 위한 EXPLAIN ANALYZE VERBOSE 사용을 참조하세요. -
CloudWatch 경보 설정: DPU 지표에 대한 경보를 생성하여 예상치 못한 사용량 급증에 대한 알림을 받습니다.