skip to content

Google BigQuery

3 roadmaps36 questionsupdated

BigQuery is the serverless end of the spectrum: no cluster to size, with queries billed by bytes scanned or against reserved slots. Interviewers use it to test whether I can control cost through table design rather than through infrastructure.

on this pageshow

guide

overview

~1 min

Google BigQuery is a serverless analytical warehouse: you create datasets and tables, write SQL, and Google supplies compute for each query. Since nothing needs provisioning, interviewers move the conversation to what you *do* control — how tables are laid out, how data arrives, and how every query turns into a bill. A strong BigQuery answer ties a design choice to the bytes it saves or the slots it burns. The hub follows that thread. [Serverless architecture](/topics/db-bigquery-architecture) explains where data lives and how a query fans out across shared compute, the ground every cost argument stands on. [SQL and data types](/topics/db-bigquery-sql-types) covers the nested, repeated schema BigQuery favours over normalised joins. [Partitioning and clustering](/topics/db-bigquery-partitioning-clustering) is where most "make this query cheaper" questions are settled, and [pricing and slots](/topics/db-bigquery-pricing-slots) turns that into money: on-demand bytes versus reserved capacity, estimates and guardrails. [Data loading and streaming](/topics/db-bigquery-ingest) contrasts batch and streaming paths on freshness, duplicates and price. [ML and BI integration](/topics/db-bigquery-ml-bi) covers the consumers — dashboards, spreadsheets, in-warehouse models — and the access controls that sit in front of raw tables. Junior rounds check the model: what a slot is, what an array column holds. Senior and principal rounds are cost and design reviews — a runaway dashboard, a table that scans everything, a reservation plan for several teams. Learn the architecture first, then table design, then pricing; loading and the BI layer read easily once those three are in place.

primer

### Storage and compute are separate services Table data sits in Google-managed, columnar storage; compute is a shared pool handed to each query as **slots** for as long as it runs. That separation is why nothing needs provisioning — and why table reads travel over the network rather than from a local disk. ### You pay for what you touch Under on-demand billing the meter is **bytes processed**: the columns a query references, across the partitions it cannot rule out. Under capacity billing it becomes slot time against a reservation you bought. Either way, cost follows the query and the table layout, so interviewers treat it as a design question, not an operations one. ### Layout is the main cost lever - **Column choice** limits width: naming columns instead of `SELECT *` is the first saving. - **Partitioning** limits which slices of a table the planner considers, decided before any data is read. - **Clustering** orders data inside those slices so whole blocks can be skipped while the query runs. A good "why is this expensive" answer names which lever failed. ### Denormalise with nesting, not duplication BigQuery favours wide rows where a parent carries its children as `ARRAY<STRUCT<...>>`. The join disappears, and columnar storage still reads only the leaf fields a query names. The cost moves elsewhere: flattening arrays changes row counts, and an aggregate written for one grain silently runs at another. ### Serverless is not limitless The pool scales by adding workers, not by enlarging one, so work that must gather everything in a single place can still fail or crawl. Recognising that shape is a senior-level signal. ### Freshness has a price and a guarantee Batch loads and streaming writes land in the same tables but differ in latency, billing and duplicate handling. Choosing between them means stating which of the three you are optimising.

Slot
A unit of BigQuery compute that the scheduler assigns to query stages. Capacity pricing buys slots; on-demand borrows them from a shared pool.
Dremel
The query engine behind BigQuery. It splits SQL into stages that run in parallel on slots, exchanging intermediate data through a shuffle layer.
Colossus
Google's distributed file system, where BigQuery keeps table data. Compute reads from it over the network rather than from worker disks.
Bytes processed
The on-demand billing measure: the uncompressed size of every column a query reads from the partitions it could not exclude.
Dry run
A query submitted for validation and estimation only. It reports expected bytes processed without executing or billing the query.
Partition pruning
The planner excluding whole partitions from a query because its filter on the partitioning column rules them out before execution.
Clustered table
A table whose data is sorted by up to four chosen columns, letting queries filtering on them skip storage blocks at runtime.
ARRAY and STRUCT
BigQuery's repeated and record types. Combined, they let one row hold a list of sub-records, the idiomatic alternative to a child table.
UNNEST
The operator that turns an array into a set of rows, usually joined back to its parent row to query the elements.
Reservation
A named pool of purchased slots. Assignments bind projects, folders or the organisation to it, so their jobs run on that capacity.
Storage Write API
BigQuery's gRPC write interface, whose stream types trade when rows become visible against delivery guarantees.
Authorized view
A view granted read access to source data on its own behalf, so readers query the view without holding permissions on the underlying tables.
INFORMATION_SCHEMA jobs views
System views listing past jobs with bytes billed, slot time and stage statistics, used to attribute cost and diagnose slow queries.

Follow a table from arrival to a dashboard. Rows arrive by a load job from Cloud Storage, by the Storage Write API, or through a managed transfer, and land in columnar storage split by the table's partitioning and sorted by its clustering. When a query arrives, the planner discards partitions its filter excludes, then compiles the SQL into stages; each slot fetches just the columns named, skips blocks that clustering rules out, and passes intermediate rows through shuffle until the last stage produces the output. The bill is either the bytes those reads covered or the slot time charged to a reservation. Downstream, BI tools, spreadsheets and BigQuery ML issue ordinary query jobs against the same tables, often through views and row policies rather than raw access. Each section of the hub owns one step of that path, and the BI layer multiplies all of them, because every dashboard refresh is another job. The table definition is where several of these decisions meet at once: ```sql CREATE TABLE analytics.events ( event_ts TIMESTAMP, user_id STRING, event_name STRING, items ARRAY<STRUCT<sku STRING, qty INT64>> -- children nested, no join ) PARTITION BY DATE(event_ts) -- planner-time pruning CLUSTER BY user_id, event_name -- runtime block skipping OPTIONS (require_partition_filter = TRUE); -- refuse unfiltered scans ``` Each line is a cost decision made before any query is written. The partition key only pays off if queries filter on it in a form the planner can resolve, and the clustering order only helps queries that filter on its leading columns.

  1. Serverless Architecture →

    Where the subject starts: separated storage and compute, slots and stages, the model every cost answer relies on.

  2. SQL and Data Types →

    Nested and repeated fields shape every table, and flattening mistakes appear at every level.

  3. Partitioning and Clustering →

    The main lever on bytes scanned, and the home of the most practical cost questions.

  4. Pricing and Slots →

    Turns table design into money: on-demand versus capacity, estimates and guardrails.

  5. Data Loading and Streaming →

    Batch versus streaming, compared on freshness, price and duplicate risk.

  6. ML and BI Integration →

    The consumers and access controls layered on top, where cost multiplies across dashboards.

  • Expecting LIMIT to shrink an on-demand bill: the meter follows columns read, not rows returned — see on-demand pricing.

  • Filtering a partitioned table through a subquery or an opaque expression and assuming pruning still happens — see pruning blockers.

  • Quoting a dry-run estimate as the exact cost of a query on a clustered table; block skipping happens later, so the figure is a ceiling.

  • Flattening an array with a comma join and then summing a parent-level column, which silently drops empty parents and multiplies totals.

  • Answering "Resources exceeded" with "it scales automatically" instead of finding the operation that funnels all rows through one worker.

  • Claiming streaming ingestion is exactly-once by default; retried appends without offsets are at-least-once, and duplicates are the usual result.

BigQuery is a managed service with no release numbers to pin, so this guide assumes it as it runs today: GoogleSQL as the dialect, the Storage Write API for streaming, and edition-based capacity pricing. Interviewers still probe the older layers, because long-lived projects carry them: - **Legacy SQL versus GoogleSQL.** BigQuery began with its own dialect; the standard-compliant one, now called GoogleSQL, is the recommended choice, yet old scripts and some tool defaults still use legacy SQL. - **`insertAll` versus the Storage Write API.** Row-at-a-time streaming predates the Storage Write API and offered only best-effort deduplication; a duplicate hunt often starts by asking which one a pipeline uses. - **Flat-rate versus editions.** In 2023 capacity pricing moved from flat-rate commitments to editions with slot autoscaling, so "flat-rate" in an answer dates it.

Interviewers expect you to place BigQuery among cloud warehouses. Its closest rivals are Snowflake, Amazon Redshift and Databricks SQL. The difference that comes up most is who decides compute size: Snowflake has you choose and start virtual warehouses, Redshift grew up around provisioned clusters, while BigQuery hands out slots per query. That moves cost control from infrastructure to table layout and query discipline. Around it sit the Google Cloud neighbours a BigQuery pipeline is usually wired to: Cloud Storage as the landing zone for files and external tables, Pub/Sub and Dataflow for streaming, and Looker, Looker Studio and Connected Sheets as consumers. Tools such as dbt run their models as ordinary BigQuery jobs, so the same cost rules apply. Spiky, ad-hoc analytics over large append-heavy data suits BigQuery; steady, latency-sensitive serving belongs to an operational database in front of it.

explore

report an issue with this guide →

questions

page 1 of 2

Why doesn't BigQuery require you to provision or size a cluster before running a query?

level: juniorimportance: must knowfreq 72%

answer

  1. no nodes to pick before querying
  2. storage and execution are separate services
  3. compute arrives per query, then leaves
  4. the unit is a slot, not a node

basics

~20 s

BigQuery is serverless: table data lives in Google-managed storage, and compute comes from a shared pool that Google's scheduler assigns to your query as slots for the duration of the query. There is no cluster to create, size, or resume.

solid answer

~40 s

BigQuery has no user-visible servers. Your tables are stored in Google's distributed file system in a columnar format, independent of any compute. When you submit SQL, the service plans the query, then a scheduler hands it **slots** — BigQuery's unit of compute — out of a large multi-tenant pool managed by Google's cluster manager. Those slots are taken back when the query finishes, so nothing is idling between queries and there is no node count, instance type, or resize operation for you to choose. You pay either per byte scanned (on-demand) or for purchased capacity, and storage is billed separately from query execution. What you *do* control is how much data a query has to touch — the schema, partitioning, and the columns you select — not how many machines run it.

go deeper

for a junior

Be ready to say plainly that BigQuery has no cluster or node count to choose: you submit SQL, and Google assigns compute called slots for the life of the query.

for a middle

Explain the mechanics: data sits in Colossus in a columnar format, Dremel executes a stage graph, and the scheduler hands slots to work units and reclaims them, so parallelism is decided per stage rather than declared.

for a senior

Show that you know what replaces sizing in practice — bytes scanned, bytes shuffled, and slot contention are the things you measure and control, and predictable throughput comes from purchased capacity rather than tuning workers.

for a principal

Own the trade-off you accept by choosing a system with no machine-level knobs: elasticity and zero capacity planning in exchange for opaque per-query performance, which you buy back with capacity commitments and workload separation rather than with hardware.

## What "serverless" actually means here Most data warehouses ask you to buy a machine shape before you can run a query: a cluster of nodes, a virtual warehouse of some size, an instance class. Those systems couple three things together — how much data you can hold, how much compute you get, and how much you pay while idle. BigQuery decouples all three. You create a dataset and a table, load data, and run SQL. There is no cluster object in the API, no node count, no "resume the cluster and wait" step before the first query. Underneath, the pieces are real servers, they are just not yours: - **Storage** — table data is written to Colossus, Google's distributed file system, in BigQuery's columnar format. It is durable and replicated, and it exists whether or not anything is querying it. - **Compute** — query execution runs on Dremel, a multi-tenant execution service. The machines it runs on are scheduled by Google's cluster manager and shared across many customers. - **Network** — because the data is not on the worker's local disk, every scan is a network read. Google's datacenter network is fast enough that reading remote storage is not the bottleneck it would be in a typical on-premise design. ## Slots: the unit you get instead of nodes BigQuery expresses compute as **slots**. A slot is a unit of compute — Google describes it as a virtual CPU — that BigQuery uses to execute one unit of query work. A query is planned as a graph of stages; each stage is split into many small work units; the scheduler assigns available slots to those units and reassigns them as stages complete. Two consequences follow: 1. **Parallelism is dynamic.** A stage that reads 10,000 file splits can be spread far wider than a stage that reads 3. You never declare the width; the planner and scheduler decide, based on the shape of the data and how many slots are available at that moment. 2. **Slots are shared and reclaimed.** Between stages, and between concurrent queries, slots move. Nothing sits warm and billable on your behalf in the on-demand model. ## What you give up, and what you get The trade is control for elasticity. You get: - No capacity planning before the first query, and no cold-start-a-cluster step. - No storage-versus-compute sizing compromise — a tiny amount of compute can query a very large table, and a large query does not require you to grow storage. - No index rebuilds, vacuums, or node maintenance as an operational chore. You give up: - The ability to tune workers directly. There is no "give this query more memory per node" knob; you influence execution by changing the query and the physical layout of the table. - Predictable per-query performance in the on-demand model, because slot availability is shared. Buying capacity is what makes performance more predictable — that is the reservation model, and it is a separate topic from architecture. ## The levers that replace cluster sizing Because you cannot size machines, the performance and cost levers are all about the *work*, not the *hardware*: - **Bytes read.** Select only the columns you need — a columnar store reads only referenced columns — and filter on the table's partition column so whole date ranges are skipped. - **Bytes moved between stages.** Aggregate before joining, avoid exploding row counts, and avoid operations that funnel all rows through one worker. - **Result reuse.** Repeating an identical query against unchanged tables can be served from the cached result rather than executed again. ## How to say this in an interview The crisp version: *BigQuery separates storage from compute completely. Data lives in Colossus; execution borrows slots from a shared Dremel pool per query and gives them back. There is no cluster to size because there is no cluster that belongs to you.* Then name the consequence that matters to an operator: you tune the query and the table layout, never the machines. A common junior mistake is to describe BigQuery as "a database that autoscales its cluster." It does not scale a cluster of yours up and down — there is no such cluster to begin with. That distinction is exactly what the question is probing.

  • If there is no cluster to size, what levers do you actually have to make a BigQuery query faster?
    Reduce the work. Select fewer columns so the columnar scan reads less; filter on the partitioning column so whole partitions are skipped; cluster the table on common filter columns; pre-aggregate before joining so less data moves between stages; and reuse cached results for identical repeated queries. For predictable throughput under contention, buy capacity rather than relying on on-demand slot availability.
  • Does serverless mean a BigQuery query can never run out of resources?
    No. Slots are elastic in number, but each worker has bounded memory, and some operations funnel work into very few workers — a global ORDER BY, a window function with no PARTITION BY, or a single enormous aggregation group. Those can fail with a resources-exceeded error no matter how many slots are available, because the problem is concentration, not total capacity.
  • What is still billed when nobody runs a query for a month?
    Storage. Table data persists in Colossus independently of compute, so you pay to keep it regardless of query activity, and long-untouched data moves to a cheaper long-term storage rate automatically. Under on-demand pricing there is no idle compute charge, because no compute is held for you between queries.

saying these in an interview costs you the question

  • Says BigQuery autoscales your dedicated cluster up and down
  • Calls a slot a virtual machine you rent per hour
  • Thinks you must resume a warehouse before the first query
  • Claims serverless means queries can never fail on resources
  • Assumes storage cost disappears when no queries run

context

open as a page

In BigQuery, how does a batch load job from Cloud Storage work, and which formats can it read?

level: juniorimportance: must knowfreq 75%

basics

~20 s

A BigQuery load job reads files from Cloud Storage and commits them into a table atomically — all rows or none. It reads CSV, newline-delimited JSON, Avro, Parquet and ORC, and carries no per-byte ingestion charge.

open as a page

What partition types does a BigQuery table support, and how is each declared?

level: juniorimportance: must knowfreq 80%

basics

~20 s

BigQuery supports three partition types: ingestion-time (the _PARTITIONTIME pseudo-column), time-unit column (a DATE, TIMESTAMP or DATETIME column at hour, day, month or year granularity), and integer range via RANGE_BUCKET. All are declared with PARTITION BY in the DDL.

open as a page

In BigQuery's on-demand pricing model, what determines how much a query costs?

level: juniorimportance: must knowfreq 82%

basics

~10 s

Under BigQuery on-demand pricing you pay per byte processed: the uncompressed size of the columns the query reads, after partition and cluster pruning. The number of rows returned is irrelevant, so LIMIT changes nothing.

open as a page

In BigQuery, what do ARRAY and STRUCT columns store, and how do you read values inside them?

level: juniorimportance: must knowfreq 80%

basics

~20 s

A STRUCT is a record of named, typed fields you address with dot notation. An ARRAY is a repeated field holding an ordered list of values in one row; to treat its elements as rows you must UNNEST it.

open as a page

How does BigQuery execute a query across Dremel, Colossus and the Jupiter network?

level: middleimportance: must knowfreq 68%

basics

~20 s

BigQuery compiles SQL into a directed graph of stages executed by Dremel. Slots read only the referenced columns from Capacitor files on Colossus over the Jupiter network, pass intermediate rows through an in-memory shuffle tier, and a final stage writes the result.

open as a page

When should you use the BigQuery Storage Write API instead of a batch load job from Cloud Storage?

level: middleimportance: must knowfreq 65%

basics

~20 s

Use the BigQuery Storage Write API when rows must be queryable within seconds or arrive one at a time from an application. Use batch load jobs otherwise — they carry no per-byte ingestion charge and commit atomically, while streamed bytes are billed.

open as a page

How does a BigQuery authorized view give a team query access without access to the source tables?

level: middleimportance: must knowfreq 60%

basics

~20 s

An authorized view sits in a separate dataset that you authorize on the source dataset. Readers are granted access to the view's dataset only; the view reads the base tables under its own authorization and exposes just the columns and rows it selects.

open as a page

What is BigQuery ML, and when would you train a model with CREATE MODEL instead of exporting data?

level: middleimportance: must knowfreq 55%

basics

~20 s

BigQuery ML trains and serves models inside the warehouse with SQL: CREATE MODEL fits a model on a query's result set and ML.PREDICT scores rows. Use it when the data already lives in BigQuery and the model type is a standard one.

open as a page

Why does a filter on a BigQuery date-partitioned table sometimes scan every partition?

level: middleimportance: must knowfreq 78%

basics

~20 s

BigQuery prunes partitions only when it can resolve the predicate on the partitioning column before execution. Comparing that column to a subquery result, ORing it with a non-partition predicate, or wrapping it in an expression BigQuery cannot map back to partition boundaries all force a full scan.

open as a page

In BigQuery, how does clustering differ from partitioning, and when do you need both?

level: middleimportance: must knowfreq 75%

basics

~20 s

Partitioning splits a BigQuery table into physical segments on one date or integer expression and is eliminated at planning time. Clustering sorts rows inside each partition by up to four columns so BigQuery can skip blocks at runtime. Use a date partition plus clustering on the high-cardinality filter columns.

open as a page

How do you estimate what a BigQuery query will scan before running it?

level: middleimportance: must knowfreq 68%

basics

~10 s

Run it as a BigQuery dry run: the console query validator, bq query --dry_run, or dryRun: true in the API. It returns estimated bytes processed without executing the query and without charge.

open as a page

In BigQuery, why does FROM t, UNNEST(t.items) AS item drop rows whose items array is empty?

level: middleimportance: must knowfreq 65%

basics

~20 s

The comma is a CROSS JOIN, and cross-joining a row against zero elements produces no output rows, so parents with empty arrays disappear. Use LEFT JOIN UNNEST(t.items) AS item to keep them, with the element columns NULL.

open as a page

Why does BigQuery keep table data in Colossus instead of on the query workers' disks?

level: middleimportance: should knowfreq 56%

basics

~20 s

Keeping data in Colossus makes compute stateless: any worker can serve any query, capacity can change mid-query without rebalancing data, and storage persists and is billed independently. Google's Jupiter network plus columnar files make the remote reads fast enough.

open as a page

What are the default, committed, buffered and pending streams in the BigQuery Storage Write API?

level: middleimportance: should knowfreq 55%

basics

~20 s

They differ in when rows become visible and what guarantee you get. The default stream is at-least-once and always available; committed streams make rows visible on append and support exactly-once via offsets; buffered streams hold rows until you flush; pending streams hold everything until one atomic commit.

open as a page

In BigQuery, when should data stay in an external table on Cloud Storage instead of being loaded?

level: middleimportance: should knowfreq 48%

basics

~20 s

Keep data external when other engines own the files, the data is queried rarely, or you are still exploring it. Load it into BigQuery once queries repeat, because native storage gives clustering, DML and predictable performance that an external table cannot.

open as a page

In BigQuery, when should a column use the native JSON type instead of a STRING holding JSON?

level: middleimportance: should knowfreq 48%

basics

~20 s

Use the native JSON type when the payload's shape varies but you query paths inside it: values are stored parsed, so path access is direct and only the referenced paths need reading. Keep STRING only for opaque payloads you never query into.

open as a page

How do you find which stage of a slow BigQuery query consumed the slot time?

level: seniorimportance: should knowfreq 44%

basics

~20 s

Read the job's per-stage statistics: the execution details in the console, or the job_stages array in INFORMATION_SCHEMA.JOBS_BY_PROJECT. Rank stages by slot_ms, then look at records read, shuffle bytes, and wait/read/compute/write timings to see why that stage was expensive.

open as a page

Why can a BigQuery query fail with "Resources exceeded" if BigQuery scales automatically?

level: seniorimportance: should knowfreq 54%

basics

~20 s

BigQuery scales the number of workers, not the memory inside one worker. Operations that funnel all rows into a single worker — a global ORDER BY, a window function with no PARTITION BY, one enormous group — exceed that worker's memory no matter how many slots are free.

open as a page

A BigQuery streaming pipeline is producing duplicate rows. How do you diagnose and eliminate them?

level: seniorimportance: should knowfreq 50%

basics

~20 s

Duplicates usually mean at-least-once writes: the default stream or legacy insertAll retried an append whose acknowledgement was lost. Fix it upstream with application-created committed streams and per-request offsets, or downstream by deduplicating on a business key.

open as a page

A nightly BigQuery load of one 300 GB gzipped CSV from Cloud Storage takes hours. Why, and what would you change?

level: seniorimportance: should knowfreq 45%

basics

~20 s

Gzip is not splittable, so BigQuery must read that file with a single worker — the load is serialised no matter how much capacity exists. Split the data into many files, or use Avro or Parquet, whose internal blocks can be read in parallel.

open as a page

A Looker Studio dashboard on BigQuery bills far more than expected — how do you diagnose and cut it?

level: seniorimportance: should knowfreq 42%

basics

~20 s

Every chart, filter and refresh is a separate BigQuery job scanning the source table. Attribute the spend from INFORMATION_SCHEMA.JOBS_BY_PROJECT, then point the dashboard at a partitioned, clustered rollup table, lengthen cache freshness, and consider a BI Engine reservation.

open as a page

In BigQuery, how do row access policies differ from publishing one authorized view per audience?

level: seniorimportance: should knowfreq 45%

basics

~20 s

A BigQuery row access policy attaches a named filter and a grantee list to the table itself, so every query by those principals is filtered automatically. Views push the same logic into one object per audience, which duplicates and drifts.

open as a page

Why does a BigQuery dry run overestimate bytes for a query on a clustered table?

level: seniorimportance: should knowfreq 50%

basics

~20 s

A dry run reports what BigQuery can determine before execution. Partition elimination is decided then and is reflected, but clustering skips storage blocks during execution, so the estimate assumes no block skipping and is an upper bound on the bytes a clustered table actually bills.

open as a page

How do you stop one careless BigQuery query from billing terabytes?

level: seniorimportance: should knowfreq 52%

basics

~20 s

Layer controls: maximum_bytes_billed fails an oversized job before it reads data, custom query-usage-per-day quotas cap a project or user for the day, require_partition_filter blocks unfiltered scans of big tables, and INFORMATION_SCHEMA attributes what still slips through.

open as a page

When would you move a BigQuery workload from on-demand pricing to slot reservations?

level: seniorimportance: should knowfreq 58%

basics

~20 s

Switch when spend is high and predictable: measure actual slot demand from INFORMATION_SCHEMA total_slot_ms, compare a reservation sized to that demand against your per-byte spend, and move when capacity is cheaper or you need predictable cost and performance.

open as a page

After flattening a repeated field in BigQuery, why does SUM(o.order_total) come back inflated?

level: seniorimportance: should knowfreq 55%

basics

~20 s

Flattening repeats each parent column once per array element, so a parent-level measure is summed once per child and multiplied by the array length. Aggregate the array in a scalar subquery instead, keeping the query at one row per parent.

open as a page

How would you choose partition granularity and clustering columns for a multi-terabyte BigQuery event table holding five years of history?

level: principalimportance: should knowfreq 38%

basics

~20 s

Pick the coarsest granularity that still prunes for the dominant queries: daily for five years of history keeps partition count and partition size sane, hourly usually does not. Then cluster on the most-filtered high-cardinality columns, leading with the one queries name most, and enforce a required partition filter plus expiration.

open as a page

How would you design BigQuery slot reservations and assignments for several teams sharing one organization?

level: principalimportance: should knowfreq 42%

basics

~20 s

Buy capacity once in an admin project, then split it into a few reservations by workload class — production pipelines, BI, ad-hoc — bind projects or folders to them with assignments, commit only the confident floor, and let autoscaling and idle-slot sharing absorb the rest.

open as a page

When would you keep BigQuery child data nested in ARRAY<STRUCT> rather than splitting it into a separate table?

level: principalimportance: should knowfreq 42%

basics

~20 s

Nest when children are always read with their parent and never independently: the join disappears, the row stays atomic, and leaf columns are still pruned. Split them out when children are updated individually, queried on their own, or unbounded in number.

open as a page

showing 1–30 of 36