The Physical vs. Logical Storage Trap (why your warehouse bill crept up)
Published September 17, 2026
The 60-second version
- Storage billing has two models: logical (uncompressed, cheaper per GB) and physical (compressed, pricier per GB but 7–12x smaller).
- Raw marketing tables compress heavily. Toggling to physical storage cuts storage bills in half for typical JSON or event datasets.
- The fix: set dataset storage billing model to PHYSICAL, add partition expiration to raw tables, and delete unpruned clones.
Your data team audits BigQuery every quarter. They check expensive queries, enforce date partition filters, and pat themselves on the back for keeping query compute under ₹25,000 a month.
Then the monthly Google Cloud bill arrives, and the BigQuery total is ₹85,000.
The extra ₹60,000 was not compute. It was BigQuery active storage, quietly compounding as two years of raw ad event logs, uncompressed webhook staging tables, and forgotten test datasets sat idle in your warehouse. You spent weeks optimizing SQL execution while paying rent on dead, uncompressed disk space.
The silent half of the cloud invoice
⚡ Query compute (Slots & Scans)
Loud, immediate, and visible. A bad query fails with an alert, or an analyst spots a 4 TB scan on a dashboard. It demands immediate attention.
- Billed per byte scanned or slot-hour
- Visible in query history immediately
- Easy to blame on a single analyst
💾 Storage billing (Logical vs Physical)
Silent, permanent, and automated. Every daily ingestion pipeline adds gigabytes that never leave. Storage charges recur 24 hours a day, 365 days a year.
- Billed every second tables exist
- Invisible in query execution plans
- Accumulates silently until finance reviews the bill
Compute costs stop when you close your laptop. Storage costs run every second of the year.
Until recently, BigQuery gave you no choice: you paid for logical storage — the uncompressed volume of your data. If an event row took 2 KB of JSON text, you paid for 2 KB, regardless of how efficiently Google's underlying filesystem stored it.
Now, BigQuery lets you choose between Logical Storage and Physical Storage. Making the wrong choice on an active dataset can easily double or triple your monthly storage invoice.
Logical vs physical: how Google measures a gigabyte
The two billing models have very different pricing and mechanics:
| Metric | Logical Storage | Physical Storage |
|---|---|---|
| What is measured | Uncompressed bytes of your data | Compressed bytes written to disk |
| Active storage rate | ~$0.020 per GB / month | ~$0.040 per GB / month (2x higher base rate) |
| Long-term storage (>90 days idle) | ~$0.010 per GB / month | ~$0.020 per GB / month |
| Time travel & fail-safe storage | Free (included in base price) | Billed as physical bytes |
| Where it wins | Small, uncompressed or encrypted tables | Large, repetitive marketing event datasets |
At first glance, Physical Storage looks twice as expensive ($0.040 vs $0.020 per GB). don't stop at the rate card!
The catch is compression ratio. Tabular data with repetitive strings (like utm_source = 'facebook', event_name = 'page_view', or nested ad metadata) typically compresses at a ratio of 5:1 to 12:1 inside Google's Capacitor columnar format.
Paying 2x the rate on a table that is 8x smaller means a net 75% reduction in your storage bill.
The compression math across typical marketing tables
Here is an audit of a 15 TB marketing analytics warehouse holding GA4 event logs, Shopify webhooks, and Meta Ads spend tables.
Switching a 15 TB marketing warehouse to physical billing
At this compression ratio, Physical Storage is significantly cheaper. Switching your dataset will reduce your monthly storage bill.
Auditing your datasets and making the switch
Before you toggle any setting, check your actual compression ratio using BigQuery's INFORMATION_SCHEMA.
Show SQL
If your audit shows a compression ratio greater than 2.0 on your large tables, switching that dataset saves money immediately.
To switch an existing dataset to physical storage billing, run this one-line DDL:
Show DDL
The 14-day lock: Once you change a dataset's storage billing model, BigQuery prevents you from changing it back for 14 days. Run the audit query above first to verify your compression ratio exceeds 2:1 before executing the alter statement.
BigQuery storage cleanup checklist run these quarterly →
- Set partition expiration on raw event tables — tables like `ga4_events_raw` should automatically drop partitions older than 90 or 180 days.
- Reduce Time Travel window on staging tables — change the default 7-day time travel to 2 days on transient ETL datasets to eliminate phantom physical storage.
- Audit dead table clones — verify that development copies like `orders_backup_october` aren't silently accruing full storage fees.
Quick gut-check
One question. Get it and the whole post clicks. 30 seconds, no maths!
A raw events dataset has 10 TB of uncompressed logical data and 1.25 TB of compressed physical data. Which billing model is cheaper?
Frequently asked questions
Does switching to physical storage affect query speeds?
Not by a single millisecond. Query execution engines always read compressed data from disk regardless of how you are billed. The storage billing model is purely an accounting setting for how Google calculates your monthly invoice.
What about tables with heavy time travel?
When you choose Physical Storage, Google bills for time-travel storage (retained versions of altered or deleted rows) and fail-safe storage. If you run massive UPDATE or MERGE statements daily that rewrite 80% of a table, time-travel bytes can accumulate. For staging tables, reduce your time-travel window from 7 days to 2 days to keep costs low.
Can I set physical storage for only one table?
No. BigQuery applies the storage billing model at the dataset (schema) level, not per individual table. Move your high-compression event logs into their own dedicated dataset (e.g., events_warehouse) and toggle that dataset to PHYSICAL.
The summary
- BigQuery bills for two distinct things: query compute (slots/scans) and storage (data at rest).
- Logical storage charges for uncompressed raw bytes at ~$0.02/GB; physical storage charges for compressed disk footprint at ~$0.04/GB.
- Marketing tables (GA4, Meta/Google ad logs, webhooks) contain repetitive text that compresses at ratios between 5:1 and 12:1.
- Any dataset with a compression ratio above 2:1 saves significant money on Physical Storage.
- Always check
INFORMATION_SCHEMA.TABLE_STORAGEto confirm your compression ratio before executingALTER SCHEMA.
Takeaways for your next report
- Storage costs accumulate 24/7 and can quietly rival query compute on long-running warehouses.
- Physical storage is twice the unit rate ($0.04 vs $0.02) but charges on compressed bytes.
- Marketing event tables regularly compress 7–10x, turning physical billing into a 60–75% cost reduction.
- Audit compression ratios in SQL and toggle datasets with a simple ALTER SCHEMA command.
BigQuery Cost Estimator
Estimate what a query will cost before you run it — from validator bytes, with a table-scan simulator and a paste-your-query cost audit. On-demand BigQuery pricing, made concrete.
Chinmay Raibagkar
About author →Founder of DataLens AI. He helps non-technical teams read their ad and database numbers with confidence — which number to trust, what to do next, and what to ignore.