AWS cost · Athena
Why Athena is expensive: $5 per TB scanned
Athena looks almost free until you understand what you are paying for. There are no servers to run and no cluster to keep alive - you are billed $5 for every terabyte a query scans. That pricing rewards reading less data, and most people set their data up to read the maximum: raw CSV or JSON, one giant prefix, no partitions. So every query drags across the whole dataset, and a dashboard that refreshes all day turns a cheap-looking service into one of the more expensive lines on the bill.
Athena charges $5 per terabyte scanned - not per query, not per hour. An unpartitioned table in a row format reads everything every time, while the same data as partitioned, compressed Parquet reads a sliver. The gap between the two is routinely 10 to 100 times the cost, for identical results.
How Athena pricing works
The meter is bytes scanned, at $5 per TB, rounded up to the nearest 10 MB with a 10 MB minimum per query. Runtime does not matter; rows returned do not matter. What matters is how much of your data in S3 the query had to read to answer - which is entirely in your control through how the data is stored:
| What the query reads | Cost | Scale |
|---|---|---|
| 1 TB scanned | $5 | $5 per run |
| 10 TB scanned/day | $1,500/month | $18,000/year |
| Same data, partitioned Parquet | ~$15 to $150/month | 10 to 100x less |
Where the scan cost comes from
Two storage choices decide almost the entire bill. The first is format: a row-based format like CSV or JSON forces Athena to read every column of every row, while a columnar format like Parquet lets it read only the columns your query names. The second is layout: without partitions, every query scans every file in the table, even when you filter on a date. Partition by the columns you filter on - usually a date - and Athena skips everything outside the range.
How to see what your queries scan
Every query records the bytes it scanned. Pull it for a recent query and multiply by $5 per TB to see what that one run cost:
# bytes scanned by a specific query execution
aws athena get-query-execution --query-execution-id <id> \
--query 'QueryExecution.Statistics.DataScannedInBytes'
# divide by 1,099,511,627,776 (bytes per TiB) and multiply by $5How to cut the bill
Convert hot tables to compressed Parquet or ORC, partition them by the column you filter on most, and select only the columns you need instead of SELECT star. Those three changes usually take a table from scanning terabytes to scanning gigabytes. Because Athena reads straight from S3, keeping that data tidy also keeps your S3 storage bill in check - compressed columnar files are smaller to store as well as cheaper to scan.
Want to know whether Athena, S3, or something else is the real driver of your bill? Connect your account read-only and see what it is wasting, in real dollars.
The role can only read - Get, Describe, List, nothing else. Read the exact permissions before you deploy it, and delete the stack whenever you want.
Frequently asked questions
How much does Amazon Athena cost?+
Athena charges $5 per terabyte of data scanned by your queries, rounded up to the nearest 10 MB with a 10 MB minimum per query. You pay for how much data each query reads, not for how long it runs or how many rows it returns.
Why is my Athena bill so high?+
Almost always because queries scan far more data than they need. A SELECT against an unpartitioned table in a row format like CSV or JSON reads every file every time. Partitioning and a columnar format cut the bytes scanned - and the bill - by 10 to 100 times.
What is the cheapest way to store data for Athena?+
Columnar formats like Parquet or ORC, compressed, and partitioned by the columns you filter on most - usually date. Athena then reads only the relevant partitions and only the columns your query selects, instead of the whole table.
Does SELECT star cost more in Athena?+
Yes, on columnar data. Because Parquet and ORC are column-oriented, Athena only reads the columns you ask for. SELECT * reads every column, so naming just the columns you need directly lowers the bytes scanned and the cost.
How do I see how much a query scanned?+
Every query reports its scanned bytes. In the console it is shown as Data scanned; from the CLI, `aws athena get-query-execution` returns DataScannedInBytes for a query execution ID. Multiply by $5 per TB to get the cost.
Does LIMIT reduce Athena cost?+
Usually not. LIMIT caps the rows returned but Athena often still scans the underlying data to find them, so the bytes scanned - and the bill - stay the same. Partitioning and column pruning are what actually cut the scan.
Related cost breakdowns
Why RDS looks expensive - and how to right-size the instance
A low-traffic MySQL database runs fine on db.t4g.small (~$23/month), not the $100+ tier an AI often quotes. Size RDS to your working set, not your row count.
Your dev and staging RDS databases are billing 24/7
A dev database used 8 hours a day still bills for 24. Scheduling stop/start on non-production RDS saves 50 to 80%. Here is how to stop paying for databases nobody is using at night.
Multi-AZ is doubling your RDS bill - do you need it?
Multi-AZ runs a standby replica around the clock, so it roughly doubles the instance cost. Essential for production, wasteful for dev and staging. Here is how to tell, and how to fix it.
The RDS costs hiding in storage and backups
RDS storage and backups bill separately from the instance - over-provisioned gp2 disk and backups beyond 100% of your DB size add up quietly. Here is how to find and trim them.