cswork / libraryOpen practice workspace

Articles

BigQuery Partitioning and Clustering Interview Questions: Pruning, Costs, and Query Shapes

Practice BigQuery partitioning and clustering interview questions with pruning examples, query shapes, cost estimates, and a clear measurement protocol.

A dashboard returns twenty rows, yet the query reads months of event data. Adding LIMIT 20 feels safer, but it does not establish a scan budget. The useful interview question is which storage BigQuery can exclude before and during execution.

Strong BigQuery partitioning and clustering interview questions connect three things: the workload's recurring filters, the table's physical organization, and evidence from the actual query job. Partitioning and clustering can reduce reads; they do not automatically make every query cheap or fast.

Evidence boundary: Google documentation was checked September 21, 2026. Official facts are labeled and linked. The event workload, SQL examples, modeled scan arithmetic, and experiment protocol are original interview exercises. No candidate reports are used, and no BigQuery jobs or cloud benchmarks were run for this article.

This article focuses on physical reads and cost diagnosis.

What is the difference between partitioning and clustering?

Official fact: A partitioned table divides data into segments. A qualifying predicate lets BigQuery exclude unrelated partitions. Partitioning also supports management at the partition level, such as expiration. Introduction to partitioned tables

Official fact: Clustering organizes storage blocks using clustering-column values. BigQuery can use block metadata to skip blocks that cannot satisfy a filter. A table can combine both mechanisms, with clustering inside its partitions. Introduction to clustered tables

Original workload: An events table serves tenant dashboards. Most requests select one tenant, a seven-day event-date interval, and sometimes one event type. For this workload, start with daily partitioning by event_date, then clustering by tenant_id, event_type.

That recommendation depends on those access patterns. A global report over all tenants does not inherit the same selectivity. Ask for representative queries, data distribution, retention requirements, and update patterns before prescribing the layout.

Avoid describing a cluster as a separate index lookup for each tenant. The interview explanation should name the storage units being skipped: partitions first, then eligible blocks within the remaining partitions.

Which date should define the partition?

In the original workload, event_date means the UTC date when the event occurred. ingested_at means when the platform received it. A purchase made January 2 but delivered January 5 belongs to different dates under those definitions.

Choose the date that matches the dominant business query and correction policy. Event-date partitioning can make January purchase reports easier to bound. Ingestion-date organization can suit operational questions about what arrived today. Neither choice removes the need to handle late data.

Official fact: BigQuery supports time-unit column partitioning, ingestion-time partitioning, and integer-range partitioning. Ingestion-time tables expose partition pseudocolumns; daily ingestion partitions can be filtered using _PARTITIONDATE. These are not interchangeable with an application's event date. Partitioning types

Design inference: If a query asks for January 2 events but filters only January 2 ingestion, it can be cheap and wrong. Include late-arrival coverage in the correctness test before celebrating lower bytes.

Choose granularity from volume and access patterns. Hourly partitions are not automatically superior to daily ones. Many tiny partitions add management and metadata overhead; a broader partition plus selective clustering may better fit the workload.

What does a pruning-friendly query look like?

This original GoogleSQL example assumes event_date is a DATE partition column and tenant_id is an INT64 clustering column:

SELECT event_type, COUNT(*) AS event_count
FROM `example_project.analytics.events`
WHERE event_date >= DATE '2026-01-02'
  AND event_date < DATE '2026-01-09'
  AND tenant_id = 42
GROUP BY event_type;

The half-open interval includes January 2 through January 8. It makes the business boundary easy to inspect and supports adjoining windows without overlapping endpoints. The example is illustrative SQL, not a recorded warehouse execution.

Official fact: Partition pruning requires a qualifying filter whose relevant partition range BigQuery can determine without reading table data. Isolating the partition column is a clear approach; supported built-in functions can also permit pruning. A blanket claim that every function disables pruning is incorrect. Verify the actual query with a dry run. Query partitioned tables

Original diagnosis matrix:

Query shapeInterview diagnosis
Literal date range plus tenant_id = 42Clear candidate for partition and block pruning; confirm the job evidence.
Date boundary read from another tableA dynamic boundary can prevent partition elimination; do not assume a small lookup makes it constant.
Tenant predicate with no date restrictionTenant selectivity does not supply a missing partition boundary.
Ingestion-date filter for an event-date requirementCheck completeness before optimizing the scan.

If a boundary comes from a control table, one proposed rewrite is to resolve it first and pass a typed value into the subsequent query. Preserve the intended consistency between those steps. A rewrite that reads a changing boundary twice can alter the requested population.

Why does clustering-column order matter?

Official fact: The order in CLUSTER BY determines the storage sort order. Filtering the leading clustering column generally gives more effective pruning than filtering only a later column. The textual order of predicates in WHERE does not change that physical ordering. Complex expressions around clustering columns can also prevent block pruning. Query clustered tables

For the original tenant dashboard, tenant_id, event_type reflects the frequent tenant restriction. An incident-analysis workload that usually asks for one event type across every tenant may justify a different order or a separate serving table.

Do not reduce this decision to “put the highest-cardinality column first.” Cardinality matters only alongside the filters people actually use and how much data those filters eliminate. A high-cardinality request ID that is rarely queried may be a poor leading choice.

Prefer a correctly typed comparison such as tenant_id = 42 over casting the stored column to text for convenience. Also distinguish filtering from result ordering: clustering does not replace ORDER BY when the consumer requires a deterministic sort.

Why can the dry run be larger than the executed scan?

Official fact: For clustered tables, the pre-execution estimate can be an upper bound. The final amount depends on blocks read during execution. A maximum-bytes-billed threshold can therefore reject a clustered query whose eventual actual usage might have been below that threshold. Estimate and control costs

Original arithmetic exercise: Suppose the referenced columns occupy 120 GiB across 30 equally sized daily partitions. A seven-day range leaves 28 GiB. If execution then reads one quarter of those selected blocks, the modeled scan becomes 7 GiB.

The calculation is 120 × 7 / 30 × 0.25 = 7. A local Python check verifies that arithmetic only. Equal daily sizes and a 25% block-read fraction are invented assumptions, not promises from BigQuery or measured savings.

Distinguish when each reduction becomes known. A partition estimate can reflect the chosen date range before execution. Additional clustering benefit may become visible only in completed-job statistics. Do not present 7 GiB as a guaranteed budget merely because the tenant contains one quarter of the rows.

When a budget guard rejects a query, inspect the estimate and intended scope first. Narrowing the interval, reducing selected columns, or using an appropriate aggregate keeps the budget decision tied to the requested work.

Does a small result or a LIMIT guarantee low cost?

Official fact: On a non-clustered table, LIMIT does not reduce the data read. Clustered tables can sometimes stop scanning after enough blocks produce the requested rows, so the precise statement is not “LIMIT never helps.” Use an explicit cost control rather than treating result count as a universal budget. Cost controls and LIMIT

Official fact: Selecting only needed columns avoids unnecessary projection work. BigQuery's performance guidance also recommends reducing data before expensive joins when the transformation preserves the intended result. Optimize query computation

Interview application: A dashboard needing event type and count should not retrieve every payload field and aggregate in the client. But removing a column used by a filter, join, or business rule can change semantics. Explain both the projected output and the columns the query still references internally.

A twenty-row aggregate can still require substantial input work. Conversely, a larger result may come from a narrow, efficiently selected slice. Result cardinality is evidence about the output, not a measurement of the input scan.

Are fewer bytes, lower cost, and faster execution the same?

Official fact: BigQuery offers on-demand analysis pricing based on processed data and capacity-based compute pricing. The billing model changes how a reduction in scan work translates into the bill. BigQuery pricing

Design inference: Under a capacity arrangement, a cheaper-looking scan does not automatically reduce an existing capacity commitment. It may instead create headroom or reduce pressure during peak demand. Avoid quoting dollar savings without the actual pricing model, region, and usage.

Official fact: The query execution plan exposes stages and work such as reads, joins, aggregation, and shuffle. These help explain expensive execution beyond the input scan. Query plan and timeline

In the original workload, successful pruning can coexist with a slow many-to-many join that multiplies rows. Check key uniqueness and stage row counts. A change that cuts bytes but introduces a join explosion is not an overall improvement.

Separate the hypotheses: layout should reduce unnecessary reads; a join rewrite should reduce intermediate work; capacity changes may affect waiting and throughput. Measuring all three together makes attribution difficult.

How would you prove the layout or rewrite helped?

Official fact: BigQuery's job metadata includes fields such as total_bytes_processed, total_bytes_billed, total_slot_ms, and cache_hit. Regional INFORMATION_SCHEMA queries require a matching execution location and appropriate permissions. JOBS view

Original experiment protocol: Fix the table snapshot, tenant, date interval, projected columns, and expected result. Compare the baseline and candidate on the same logical data. Record the SQL, table definition, job ID, cache status, estimate, completed bytes, slot time, and elapsed time.

Exclude result-cache hits when evaluating scan changes. Run several representative tenants, including a large one, because a tiny tenant can hide distribution problems. Include a late event and a boundary-date event in the correctness fixture.

Accept the change only after output equality is established at the required grain. Compare keys and values, not just total row counts. Then state the observed improvement with its workload boundary rather than claiming every query will improve.

If the date-filtered query still scans unexpectedly much, verify the actual partition column, inspect predicate shape, and compare the table definition with the SQL. If bytes fall but latency remains high, inspect execution stages and concurrency rather than changing partitioning again without evidence.

Practice explaining the query shape

The added physical-layout follow-ups below are original prompts, not claims that the source questions explicitly test BigQuery pruning.

Practice questionBigQuery follow-up
Write SQL for content view metrics by deviceChoose the date predicate and required device columns before estimating the scan.
Compute violation rate and flag precision in SQLKeep numerator and denominator populations identical while narrowing the date range.
Design a User Behavior Tracking (Clickstream Analytics) SystemDefend event-date partitioning against late arrival and tenant-specific access.
Build a cohort dashboard with Streamlit and SQLCompare repeated dashboard scans with a suitable aggregate serving layer.
Design an analytic warehouse for event dataChoose clustering order from actual workload shapes and define the measurement plan.

Practice answering with a query, a predicted storage effect, and the job evidence that would confirm or reject your prediction.

Sources and Further Reading