Partitioned tables

Partition by date or integer range. Queries filtering on the partition column only scan relevant partitions — BigQuery charges by bytes scanned.

CREATE TABLE orders
PARTITION BY DATE(created_at)
OPTIONS (require_partition_filter = TRUE)
AS SELECT * FROM orders_raw;

require_partition_filter = TRUE forces every query to include a partition filter, preventing accidental full scans.

Clustered tables

Clustering further sorts data within partitions by up to 4 columns. Queries filtering on clustered columns skip blocks automatically.

Avoid SELECT *

BigQuery is columnar — SELECT * reads every column. Specify only needed columns. A query on 3 of 100 columns costs 3% of the SELECT * equivalent.

Slot usage

On-demand pricing charges per byte scanned. For predictable, high-usage workloads, flat-rate slots (reservations) are cheaper above a certain query volume. Analyse with INFORMATION_SCHEMA.JOBS to estimate break-even.