Explanation
Why the waste happens and who it affects.
The default project-level quota allows 200 TiB of data processed per project per day and the per-user quota is unlimited, so a runaway scheduled query, a dashboard refresh loop, a script that re-runs a full-table scan, or an analyst querying an unfiltered multi-terabyte table can generate a large bill in hours before anyone notices.
Google's cost guidance is explicit that with on-demand pricing the only way to restrict costs is to configure project-level or user-level daily quotas, and it recommends the maximum bytes billed setting to limit the cost of individual queries. Both controls are opt-in and easy to leave unset, especially in shared analytics projects, sandbox projects and service accounts used by BI tools. This is a guardrail gap rather than steady waste: the cost appears as sudden spikes that budgets and alerts only report after the fact.
Billing model
The pricing dimensions that drive this cost.
On-demand query cost is uncapped unless one of these controls is set.
- On-demand compute
- Billed per TiB of data processed by each query, with the first 1 TiB per month free
- QueryUsagePerDay
- Project-level daily limit on data processed by all users; the default is 200 TiB per project per day
- QueryUsagePerUserPerDay
- Daily limit applied separately to each user and service account in the project; unlimited by default
- Maximum bytes billed
- Per-query limit; if the estimated bytes exceed it, the query fails before it runs and incurs no charge
How to detect
4 checks to find it in your estate.
- In IAM & Admin, Quotas & System Limits, filter for the BigQuery API and check whether Query usage per day and Query usage per day per user are still at their defaults for projects that use on-demand pricing
- Query INFORMATION_SCHEMA.JOBS for the largest jobs by total_bytes_billed per day and per user_email to see how much a single query or principal can spend today
- Check scheduled queries, BI tool connections and application clients for whether they set a maximum bytes billed value on their query jobs
- Look in Cloud Billing reports for day-level spikes in BigQuery analysis charges that coincide with a small number of jobs
How to fix
5 ways to remove the waste.
- Set a QueryUsagePerDay custom quota on each on-demand project sized to its normal peak day, and a QueryUsagePerUserPerDay quota so a single user or service account cannot consume the whole project allowance; lowering a quota takes effect within minutes
- Set maximum bytes billed on scheduled queries, service accounts and application clients (bq --maximum_bytes_billed, or maximumBytesBilled in the query job configuration) so oversized queries fail before incurring charges
- Account for the tradeoffs: quotas are a hard cap that stops all queries in the project once reached, custom quotas are approximate and can occasionally be exceeded, and on clustered tables the pre-run estimate is an upper bound, so maximum bytes billed can reject a query that would have stayed under the limit
- Add Cloud Billing budgets and alerts for BigQuery as a reporting layer, since budgets notify but do not stop queries
- For workloads that need a firm cost ceiling rather than a quota, use an editions reservation with a maximum slot setting, which limits compute capacity instead of bytes
Documentation
Vendor references for pricing and configuration.