At scale, capacity pricing and workload isolation decide both the bill and whether critical jobs finish on time.
A slot is a virtual unit of compute (CPU, memory, network). A query is broken into stages of parallel tasks, and the scheduler spreads them across available slots. More slots allow more parallelism, up to the query's limits. A query's total_slot_ms is the compute it consumed.
On-demand projects draw from a shared pool, typically up to about 2,000 concurrent slots per project, and pay per byte scanned. That's simple and great for spiky, light usage, but costs grow with data scanned, and there's no guaranteed capacity.
Capacity pricing uses BigQuery editions (Standard, Enterprise, Enterprise Plus), which differ in features and price per slot-hour:
- A reservation is a pool of slots with a baseline (always allocated) and an optional autoscaling maximum. The autoscaler adds slots in steps of 50 and bills them while allocated, with a one-minute minimum.
- Assignments attach projects, folders or the organization to a reservation for job types such as QUERY or PIPELINE.
- Commitments (one or three years) give discounts on baseline slots.
- Idle slots can be shared with other reservations (not in Standard edition).
Separate reservations isolate workloads: ELT, BI dashboards and ad-hoc analysis stop starving each other. Monitor with INFORMATION_SCHEMA.JOBS (total_slot_ms, period slot usage in JOBS_TIMELINE) and the admin resource charts. A useful break-even check: divide recent total_slot_ms by the hours in the period to see average slot usage, and compare its slot-hour cost with on-demand bytes billed.
Example
-- Average slots used per hour over the last 7 days (per project)
SELECT
TIMESTAMP_TRUNC(creation_time, HOUR) AS hour,
ROUND(SUM(total_slot_ms) / (1000 * 3600), 1) AS avg_slots,
ROUND(SUM(total_bytes_billed) / POW(1024, 4), 3) AS tib_billed
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
AND job_type = 'QUERY'
GROUP BY hour
ORDER BY avg_slots DESC
LIMIT 10;
-- Capacity setup (DDL in the admin project)
CREATE RESERVATION `admin-proj.region-us.bi`
OPTIONS (edition = 'ENTERPRISE', slot_capacity = 100, autoscale_max_slots = 400);
CREATE ASSIGNMENT `admin-proj.region-us.bi.dash_assignment`
OPTIONS (assignee = 'projects/dashboards-prod', job_type = 'QUERY');Remember
- Slots are the compute unit; total_slot_ms measures a query's compute
- On-demand bills bytes from a shared pool; editions bill slot-hours
- Reservations (baseline + autoscaling) and assignments isolate workloads
Watch out for
- Moving to capacity pricing with a large baseline that sits idle most of the day.