Google CloudBigQueryAnalytics

google_bigquery_table cost estimation

A BigQuery table is free to declare. Cost comes from the data stored in it per GB-month and the bytes queries scan against it, so schema and partitioning drive the real bill.

A google_bigquery_table defines a table (or view, or external table) inside a BigQuery dataset: its schema, partitioning, clustering, and expiration. Creating the table is free. An empty table costs nothing, and the DDL itself carries no charge. BigQuery bills for two things a table anchors: storage and the query bytes scanned against it.

Storage is billed per GB-month, split into active storage (data modified in the last 90 days) and long-term storage (untouched for 90 days), where long-term is roughly half price and applied automatically. Query cost, under the on-demand model, is billed per TiB of data scanned, and crucially BigQuery scans only the columns and partitions a query touches. This is why the table's design is the dominant cost lever: partitioning by date and clustering by common filter columns lets queries prune to a fraction of the table, cutting bytes scanned and therefore cost.

The table is free, but the schema and partitioning decisions made here determine both the ongoing storage bill and the per-query scan cost for the life of the table. c3x prices the stored bytes and the query scan cost a table drives and links it to the parent dataset, treating the table definition as free.

Terraform example

A minimal but realistic configuration that C3X can estimate.

resource "google_bigquery_table" "events" {
  dataset_id = google_bigquery_dataset.analytics.dataset_id
  table_id   = "events"

  time_partitioning {
    type  = "DAY"
    field = "event_time"
  }

  clustering = ["user_id", "event_type"]

  schema = jsonencode([
    { name = "event_time", type = "TIMESTAMP" },
    { name = "user_id", type = "STRING" },
    { name = "event_type", type = "STRING" }
  ])
}

Pricing dimensions

What you actually pay for when you provision google_bigquery_table.

DimensionUnitWhat's being charged
Table definitionfreeCreating the table and its schema has no charge. An empty table costs nothing.
$0
Active storageper GB-monthData in the table modified within the last 90 days.
~$0.02/GB-month
Long-term storageper GB-monthData untouched for 90 days, automatically billed at roughly half the active rate.
~$0.01/GB-month
Query bytes scannedper TiBOn-demand queries bill per TiB scanned, reading only the columns and partitions touched.
~$6.25/TiB scanned

Optimization tips

Common ways to reduce google_bigquery_table cost without changing the workload.

Partition by date

Often 90%+ less scanned

Time-partitioning lets queries with a date filter scan only the relevant partitions instead of the whole table, cutting bytes scanned and on-demand query cost sharply.

Cluster by common filter columns

Further scan reduction

Clustering on frequently filtered columns lets BigQuery skip blocks that cannot match, reducing scanned bytes on top of partition pruning.

Set partition expiration

Removes storage for aged-out data

Expiring old partitions automatically drops stale data so it stops billing for storage, without a manual cleanup job.

FAQ

Does a BigQuery table cost money?

Not to create. An empty table is free. Cost comes from data stored in it (per GB-month, active or long-term) and the bytes queries scan against it (per TiB under on-demand pricing).

What is the biggest BigQuery table cost lever?

Query bytes scanned, controlled by partitioning and clustering. A well-partitioned table lets queries prune to a fraction of the data, cutting per-query scan cost by an order of magnitude.

How does long-term storage pricing work?

Any table or partition not modified for 90 days automatically drops to long-term storage at roughly half the active rate. No action is needed; BigQuery applies it per partition.

Related resources

Estimate this resource in your own Terraform

Free, open source, no API key. C3X parses your Terraform and shows line-item cost for every resource, including google_bigquery_table.