BigQuery FinOps Query Pack

Which BigQuery tables are costing me the most to store?

Tables ranked by storage, split into active and long-term, logical and physical.

Free to run — INFORMATION_SCHEMA scans no billable bytesChecked 4 Aug 2026

JOBS and TABLE_STORAGE are region-scoped.

SELECT
  table_schema,
  table_name,
  total_rows,
  ROUND(total_logical_bytes      / POW(1024, 3), 2)          AS logical_gib,
  ROUND(active_logical_bytes     / POW(1024, 3), 2)          AS active_logical_gib,
  ROUND(long_term_logical_bytes  / POW(1024, 3), 2)          AS long_term_logical_gib,
  ROUND(total_physical_bytes     / POW(1024, 3), 2)          AS physical_gib,
  ROUND(time_travel_physical_bytes / POW(1024, 3), 2)        AS time_travel_gib,
  ROUND(SAFE_DIVIDE(total_logical_bytes, total_physical_bytes), 2) AS compression_ratio
FROM `region-us`.INFORMATION_SCHEMA.TABLE_STORAGE
WHERE NOT deleted
ORDER BY total_logical_bytes DESC
LIMIT 100;

What it returns

active_logical_gib
Modified in the last 90 days — full price.
long_term_logical_gib
Untouched for 90+ days — roughly half price.
compression_ratio
Logical ÷ physical. Above ~4 means physical billing is probably cheaper.

How to read it

  • You are billed on either logical or physical bytes depending on the dataset's billing model, and the cheaper one differs per dataset. The compression ratio is the deciding number.
  • time_travel_gib is real storage you pay for. A table rewritten daily can carry a time-travel footprint larger than the table.
  • A table with high long-term bytes is cheap to keep. Do not delete it for savings that are already half realised.

Run this once, or have it run every day.

Finitizer evaluates this class of question continuously against your live BigQuery estate, tracks how each number moves between runs, and turns findings into assigned tasks. Read-only and keyless.