How does BigQuery's architecture separate storage and compute, and what do Dremel, Colossus and Capacitor each do?
Why they ask this
Every cost and performance answer later in the loop follows from this. A candidate who knows that storage and compute are separate services can explain why SELECT * is expensive and why there are no indexes to tune.
Say this
Table data lives in Colossus, Google's distributed file system, in a columnar format called Capacitor; queries run on Dremel, which spreads each stage across slots and shuffles through a separate in-memory tier. Because the two scale independently, you pay for bytes stored and for bytes scanned or slot time, and a query reads only the columns it names.
The reasoning
**Storage.** Managed tables are written to Colossus in Capacitor, a columnar format: each column is stored, compressed and encoded separately, with metadata such as min and max values per block. Nothing is attached to a particular machine, so storage grows without anyone provisioning disks, and it is billed on its own — active storage, and long-term storage at roughly half the price for any table or partition not modified for 90 consecutive days.
**Compute.** Dremel turns SQL into a multi-stage execution plan. Each stage is split into units of work that run on **slots** — BigQuery's unit of compute, roughly a virtual CPU with memory. Stages exchange data through a distributed shuffle tier rather than through the workers' local disks, which is what lets the scheduler add or remove slots mid-query. The network underneath (Jupiter) is fast enough that reading remote storage is the normal case, not a penalty.
**Why it matters in practice.** Because storage is columnar, the bytes a query is billed for are the bytes of the columns it touches — `SELECT *` on a wide table costs the whole table even with `LIMIT 10`, since `LIMIT` is applied after the scan. Because compute is separate, you choose how to pay for it independently: per TiB scanned (on-demand, US list price $6.25 per TiB, first 1 TiB a month free) or per slot-hour under an edition. And because there are no indexes, the levers are partitioning, clustering and table shape, not index design.
The edge worth naming: "serverless" does not mean unlimited. An on-demand project can use up to 2,000 concurrent slots, and a query that needs more simply runs longer. That is the first thing to check when a query is slow but cheap.
The answer most people give
"BigQuery is fast because it has indexes and caches everything in memory." There are no user-managed indexes. It is fast because it reads only the needed columns and spreads the scan over many slots — and it is expensive for exactly the queries that ignore that.
They’ll ask next
If storage and compute are separate, why does a query on a table you just loaded with a million tiny files run slower than on the same data compacted?
Reported in 2 interview write-ups
