BigQuery quotas and limits that matter
The BigQuery limits people actually run into, grouped by what you are doing. 1,500 writes per table per day, 5 metadata updates per table per 10 seconds, 2 concurrent UPDATEs per table, 10,000 partitions, 2,000 on-demand slots, a 6-hour query limit and a default 200 TiB daily query quota.
Google’s quota page lists hundreds of limits. Most never matter. This page collects the ones that do, grouped by what you are doing when you hit them, with what to do instead. Quotas marked “per project” can often be raised through Google Cloud support; limits are fixed. All values are from Google’s quota page as of October 2026.
Writing to tables
| Limit | Value | When it bites |
|---|---|---|
| Table modifications per table per day | 1,500 | loading or appending to one table every minute; failed jobs count too |
| Table metadata updates per table | 5 per 10 seconds (50 for partitioned tables) | scripts that ALTER or write the same table in a tight loop |
| Partition modifications per column-partitioned table per day | 30,000 | (11,000 for ingestion-time partitioning) |
Concurrent UPDATE / DELETE / MERGE per table | 2 running, 20 queued | many small updates from an application |
INSERT statements per table per day before throttling | 1,500, then 10 at a time | row-by-row inserts |
| DML statements per table | 25 every 10 seconds |
DML statements and streaming don’t count toward the 1,500 table modifications. The fix for most of these is to batch: collect changes and apply them with one MERGE or one load, or stream with the Storage Write API. See INSERT, UPDATE and DELETE, Loading data and Streaming.
Tables and schemas
| Limit | Value |
|---|---|
| Partitions per partitioned table | 10,000 |
| Columns per table, query result or view | 10,000 |
| Nesting depth of structs | 15 levels |
| Column name length | 300 characters |
| Nested view levels | 16 |
| Clones and snapshots of one base table | 1,000 |
| Row size | about 100 MB |
10,000 partitions is 27 years of daily partitions, but only about 13 months of hourly ones, and integer-range partitioning runs into it quickly. Partition by a coarser unit or cluster instead. See Partitioning.
Queries
| Limit | Value |
|---|---|
| Query run time | 6 hours (a query may be retried internally, so up to 18 hours in total) |
| Query text | 1,024k characters; 12 MB after views and functions are expanded |
| Tables, views and functions referenced by one query | 1,000 |
| Query parameters | 10,000 |
| Response size | 10 GB compressed; larger results must be written to a table |
| Queued interactive queries per project | 1,000 |
| Queued batch queries per project | 20,000 |
| Concurrent scripts per project | 1,000 |
| Concurrent queries with remote functions | 10 |
Compute and cost
| Limit | Value |
|---|---|
| Concurrent slots, on-demand | 2,000 per project, 20,000 per organization (bursts above are possible) |
| Query bytes per day, on-demand | 200 TiB per project by default; per user unlimited by default |
| Free query bytes | 1 TiB per month per billing account |
The 200 TiB daily default is only a safety net. At the US on-demand price it is about $1,250 a day. Set a lower custom quota for the project and for each user. Querylab.io has its own daily, weekly and monthly byte budgets, but they apply only to queries run from the app (cost limits), so they don’t replace a quota. See Controlling costs.
Jobs
| Limit | Value |
|---|---|
| Load jobs per project per day | 100,000 |
| Extract jobs per project per day | 100,000 |
| Copy jobs per project per day | 100,000 |
| Data per load job | 15 TB |
| Table data per exported file | 1 GB (use a wildcard URI for more) |
| Pending jobs per project and region | 50,000 |
Streaming
| Limit | Value |
|---|---|
| Storage Write API (gRPC) throughput | 3 GB/s in us/eu, 300 MB/s elsewhere |
| Storage Write API (gRPC) connections | 5,000 per region, 20,000 per multi-region |
| REST streaming throughput | 1 GB/s in us/eu, 300 MB/s elsewhere |
| REST request | 10 MB, 50,000 rows (500 recommended) |
Seeing your usage
Quota errors name the quota, such as Exceeded rate limits: too many table update operations for this table or Your table exceeded quota for imports or query appends per table. The Quotas page in the Cloud console shows current usage for the quotas with a console entry, and INFORMATION_SCHEMA.JOBS shows the jobs behind it. Querylab.io’s query history lists the jobs of your projects, including ones run by other tools, and searches them by status and error message. See Common errors and Monitoring jobs and costs.
A rate limit error (rateLimitExceeded) is temporary: retry with exponential backoff. A daily quota error doesn’t clear until the quota window moves on.