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.