BigQuery storage cost: logical vs physical billing, long-term and time travel
BigQuery bills storage by the GiB-month, either on uncompressed (logical) bytes or on compressed (physical) bytes at twice the rate. Physical usually wins when data compresses more than 2 times, unless tables are rewritten often, because physical billing also charges for time travel and fail-safe. The prices, the rules, worked examples and the query that tells you which to pick.
Tecyfy · Published · 8 min read

BigQuery bills storage by the GiB-month in one of 2 ways per dataset: logical billing on the uncompressed size, or physical billing on the compressed size at twice the rate. Physical billing usually saves money when data compresses more than about 2 times, but it also charges for time travel and fail-safe copies, so tables that are rewritten often can end up costing more.
Neither choice changes how data is stored or how fast queries run: BigQuery always stores data compressed. Only the meter changes, and it is set per dataset.
The prices
US multi-region, per GiB a month:
| Active | Long-term (90 days unmodified) | |
|---|---|---|
| Logical (uncompressed) | $0.02 | $0.01 |
| Physical (compressed) | $0.04 | $0.02 |
Most single regions cost a little more, for example $0.023 active logical in Iowa. The first 10 GiB a month is free. A table or partition that has not been modified for 90 consecutive days moves to long-term storage and its price halves on its own. Each partition counts on its own, and only modifying or deleting its data resets the clock.
The catch: time travel and fail-safe
When you update, delete or overwrite data, BigQuery keeps the old bytes: for the time travel window (7 days by default, 2 to 7 per dataset), then for a further 7 days of fail-safe. Under logical billing that is included. Under physical billing those bytes are charged at the active physical rate.
So a table that is replaced in full every day keeps up to 14 old copies around: 7 in time travel and 7 in fail-safe.
Worked examples
A typical warehouse dataset: 50 TiB logical (51,200 GiB), compressing 6 times, 40% of it long-term, and 2% of the active data changed or deleted each day.
- Logical: 30,720 GiB × $0.02 + 20,480 GiB × $0.01 = $819 a month.
- Physical: 8,533 GiB compressed, so 5,120 × $0.04 + 3,413 × $0.02 = $273, plus 14 days × 2% of 5,120 GiB = 1,434 GiB retained × $0.04 = $57: $330 a month.
Physical saves about $489 a month, 60%.
A table rebuilt every night with CREATE OR REPLACE: 1 TiB logical, compressing 6 times.
- Logical: 1,024 × $0.02 = $20 a month.
- Physical: 171 GiB × $0.04 = $7 for the table, plus 14 days of full copies, 2,389 GiB × $0.04 = $96: $102 a month, 5 times more.
- With the time travel window cut to 2 days, physical is still $68.
Data that compresses poorly: the same 50 TiB dataset at 1.8 times compression costs $819 logical and $1,101 physical. Below about 2 times, physical cannot win.
Switch this dataset to physical
Logical billing: $819 a month. Physical billing: $273 for the data plus $57.34 for time travel and fail-safe, $330 in all. Physical saves $489 a month.
US multi-region list prices a GiB a month: logical $0.02 active and $0.01 long-term, physical $0.04 and $0.02. Physical billing also charges time travel and the 7-day fail-safe at the active rate; logical includes them. The first 10 GiB a month is free and left out here.
Find out which wins for your datasets
INFORMATION_SCHEMA.TABLE_STORAGE has both sizes for every table. This query prices each dataset both ways at US multi-region rates:
SELECT
table_schema AS dataset,
SUM(total_logical_bytes) / SUM(total_physical_bytes) AS compression,
SUM(active_logical_bytes) / POW(1024, 3) * 0.02
+ SUM(long_term_logical_bytes) / POW(1024, 3) * 0.01 AS logical_usd,
(SUM(active_physical_bytes) + SUM(fail_safe_physical_bytes)) / POW(1024, 3) * 0.04
+ SUM(long_term_physical_bytes) / POW(1024, 3) * 0.02 AS physical_usd
FROM `region-us`.INFORMATION_SCHEMA.TABLE_STORAGE
WHERE NOT deleted
GROUP BY dataset
ORDER BY logical_usd - physical_usd DESC;
active_physical_bytes already includes time travel bytes, so the physical figure counts them. These are snapshots of today's sizes; the bill is bytes multiplied by time, so treat the result as a forecast. Swap in your region's prices from the BigQuery cost calculator.
Switch, and keep it cheap
ALTER SCHEMA mydataset SET OPTIONS (storage_billing_model = 'PHYSICAL');
The change takes 24 hours, and you then have to wait 14 days before switching again. It is not available while your organisation has legacy flat-rate slot commitments in the same region; edition commitments are fine.
Then:
- Shorten time travel on datasets with heavy rewrites:
ALTER SCHEMA mydataset SET OPTIONS (max_time_travel_hours = 48);(2 days, the minimum). - Append or merge instead of replacing whole tables, so fewer bytes are retained.
- Partition by date, so old partitions stay untouched and reach long-term pricing.
- Set expirations on staging and temporary tables.
Storage is usually the smaller part of a BigQuery bill; queries are the larger. Our guide to on-demand vs editions covers that side, and Snowflake vs BigQuery compares the 2 warehouses.
Questions
- How much does BigQuery storage cost?
- In the US multi-region, logical (uncompressed) storage costs $0.02 per GiB a month for active data and $0.01 for long-term data; physical (compressed) storage costs $0.04 and $0.02. Long-term means a table or partition not modified for 90 days. The first 10 GiB a month is free.
- What is the difference between logical and physical storage billing in BigQuery?
- Logical billing charges for the uncompressed size of your data and includes time travel and fail-safe storage. Physical billing charges for the compressed size at twice the rate, and charges time travel and fail-safe bytes separately at the active rate. The data and query performance are the same either way; only the meter changes.
- When should I switch BigQuery to physical storage billing?
- When a dataset compresses by more than about 2 times and its tables are not rewritten often. Check total_logical_bytes against total_physical_bytes and time_travel_physical_bytes in INFORMATION_SCHEMA.TABLE_STORAGE first. Tables that are fully replaced every day can cost more under physical billing because of time travel and fail-safe.
- How do I switch a BigQuery dataset to physical storage?
- Run ALTER SCHEMA dataset SET OPTIONS (storage_billing_model = 'PHYSICAL'). The change takes 24 hours to apply, and you then have to wait 14 days before changing the model again. It cannot be enrolled while the organisation has legacy flat-rate commitments in the same region.
- What is BigQuery long-term storage?
- Any table or partition that has not been modified for 90 consecutive days. Its storage price drops by about half automatically, with no difference in performance, durability or availability. Each partition of a partitioned table counts separately.