All BigQuery cost anti-patterns

The 10 MB minimum, multiplied by many small tables

BigQuery bills at least 10 MB per table referenced per query. Join forty lookup tables and you have bought 400 MB before reading any real data.

What it is

Every table a query references carries a floor of 10 MB billed, and the query as a whole has the same floor. For genuinely small dimension tables, that floor is the entire cost.

Why it costs money

  • It is invisible at small scale and material in generated SQL, where a dbt model may reference dozens of seeds and lookups.
  • It is charged per query, so a small model running every fifteen minutes pays it 2,880 times a month.
  • No amount of column pruning helps — the floor is a floor.

Worked example

Expensive
-- 40 small dimension joins in one model, run every 15 minutes
The arithmetic. 40 tables × 10 MB = 400 MB minimum per run. At 2,880 runs a month that is 1.1 TB, about $7 — for lookups totalling a few megabytes of actual data.

How to fix it

  1. 1Denormalise small, slow-changing lookups into a single wide dimension table.
  2. 2Reduce run frequency where the underlying data does not change that fast.
  3. 3Check whether the model needs all forty references, or whether it inherited them from a template.
The analyzer detects this one. Paste your query into the BigQuery Query Cost Analyzer and it will point at the exact line.

Fixing one query is satisfying. Fixing the pattern is the win.

Finitizer finds every instance of this across your BigQuery job history, ranks them by what they actually cost, and keeps checking after you have fixed them.