BigQuery FinOps Query Pack

Which BigQuery tables has nobody queried in 90 days?

Storage you are paying for that nothing reads.

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

JOBS and TABLE_STORAGE are region-scoped.

-- Tables present in storage but absent from referenced_tables in 90 days
-- of job history.
WITH queried AS (
  SELECT DISTINCT
    ref.dataset_id AS table_schema,
    ref.table_id   AS table_name
  FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT,
       UNNEST(referenced_tables) AS ref
  WHERE creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)
)
SELECT
  s.table_schema,
  s.table_name,
  ROUND(s.total_logical_bytes / POW(1024, 3), 2)             AS logical_gib,
  s.total_rows,
  s.creation_time,
  s.storage_last_modified_time
FROM `region-us`.INFORMATION_SCHEMA.TABLE_STORAGE s
LEFT JOIN queried q
  ON s.table_schema = q.table_schema AND s.table_name = q.table_name
WHERE q.table_name IS NULL
  AND NOT s.deleted
  AND s.total_logical_bytes > 1024 * 1024 * 1024   -- ignore anything under 1 GiB
ORDER BY s.total_logical_bytes DESC
LIMIT 100;

What it returns

storage_last_modified_time
Last write. Old writes plus no reads is the strongest delete signal.

How to read it

  • JOBS_BY_PROJECT only sees jobs in this project. A table read from another project will look unused here and is not — run this org-wide before deleting anything.
  • Ninety days is a compliance-shaped window, not a technical one. Quarterly and annual reporting tables will appear in this list and must not be deleted.
  • Export to Cloud Storage before deleting. GCS Coldline is far cheaper than BigQuery storage, and "we deleted it" is an unrecoverable answer.

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.