BigQuery and BI tools - Connected Sheets, Data Studio, Looker, Tableau
Every BI tool sends real query jobs to BigQuery, and each refresh of a dashboard can bill. How Connected Sheets, Data Studio (formerly Looker Studio), Looker, Tableau and Power BI connect, which job labels identify them, and what keeps dashboard costs down.
BigQuery has no BI-specific query path. A dashboard in Data Studio, Looker, Tableau or Power BI, or a pivot table in Connected Sheets, sends ordinary query jobs to your project and you pay for them like any other query. What differs between tools is who the jobs run as, how often they fire, whether they hit the query cache, and how you can tell them apart in INFORMATION_SCHEMA.JOBS.
How each tool connects
| Tool | Connection | Runs as | Job identifier |
|---|---|---|---|
| Connected Sheets | built into Google Sheets (Data, Data connectors, Connect to BigQuery) | the user | job ID prefix sheets_dataconnector |
| Data Studio (named Looker Studio until April 2026) | BigQuery connector, over a table, view or custom SQL | owner’s credentials (default), viewer’s credentials or a service account | job label requestor:looker_studio |
| Looker | database connection with a service account or OAuth | the service account, or each user with OAuth | labels looker-context-user_id, looker-context-history_slug, looker-context-instance_slug |
| Tableau, Power BI, others | their BigQuery connectors, or the ODBC and JDBC drivers | whatever identity you configure | set labels where the connector or driver allows it |
In April 2026 Google renamed Looker Studio back to Data Studio, and its BigQuery docs now say Data Studio throughout. The job label still says looker_studio.
Connected Sheets
Connected Sheets shows 500 rows of preview, but pivot tables, charts and formulas run queries over the whole table. Google gives these limits: a pivot table returns at most 200,000 rows, and an extract to the sheet is capped at 50,000 rows with no cell limit, 500,000 rows with at most 5 million cells, and nothing above 500,000 rows.
Each chart, pivot table, formula or filter is a query, billed to the project the user chose when connecting (it needs a billing-enabled project). A viewer with Sheets-only access can’t refresh or schedule a refresh. Because refreshes are queries, a scheduled refresh is a recurring cost, and Google notes that filtering data in the sheet refreshes the query it sends to BigQuery.
To see what Connected Sheets costs you, filter by the job ID prefix. Google’s example sums bytes billed per user:
SELECT
user_email,
COUNT(*) AS total_queries,
SUM(total_bytes_billed) AS total_bytes_billed
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
AND STARTS_WITH(job_id, 'sheets_dataconnector')
GROUP BY user_email
ORDER BY total_bytes_billed DESC;
This is adapted from Google’s example, which also filters on state = 'DONE' and drops script parent jobs. We dry-ran it against real BigQuery and it validates, but we had no Sheets traffic to count. See monitoring jobs and costs.
Data Studio
The BigQuery connector reads a table, a view or a custom SQL query. A few settings decide the bill:
- Billing project. It can differ from the data project. For public datasets you must pick one to pay.
- Data credentials. With owner’s credentials (the default), viewers don’t need BigQuery access and queries run as the owner, against the billing project chosen in the data source. With viewer’s credentials, each viewer needs
bigquery.dataViewerandbigquery.jobUser, and queries run as that viewer. With a service account only the service account needs the roles, and Google notes that reports then don’t break when an employee leaves. - Data freshness. Data Studio keeps query results in memory for the freshness window, default 12 hours for BigQuery, adjustable from 1 minute to 12 hours. Within the window the same query is served from memory and doesn’t reach BigQuery. A different filter or date range is a new query. Google’s caution applies: normal query costs apply whenever Data Studio queries the project, including manual and automatic refreshes. With owner’s credentials all viewers share one freshness setting; with viewer’s credentials each viewer has their own, so each viewer’s queries are separate.
- Partitioned tables. Choosing a date-partitioned table lets you set the partition column as the report’s date filter. That is what makes a chart read one partition rather than the table. See partitioning.
- Sharded tables. For
prefix_YYYYMMDDtables, a chart queries only the last 28 days unless you change the date range. - Extracts. An extracted data source is a copy of chosen fields and rows stored in Data Studio, up to 100 MB and 750,000 rows (it truncates above that, and fails above 100 MB). Reports on an extract don’t query BigQuery live, only when the extract refreshes. Extracts are static unless you set an auto update schedule.
The connector returns at most 2 million rows per chart query; above that the chart truncates and shows a warning. If the data source uses owner’s credentials and you have owner permissions on the BigQuery project, a BigQuery icon on each chart shows its SQL, timings and bytes billed. Google says every query carries the job label requestor:looker_studio, so billing reports can be filtered by it. Google also points to BI Engine for faster reports and lower query concurrency costs; see below.
Looker
Looker generates SQL from LookML models and sends it over a connection configured with a billing project (and optionally a separate storage project). Things that matter for cost:
- Max Billing Gigabytes on the connection caps the bytes any single query may bill. It guards against accidentally expensive queries, and you leave it blank for no limit. Compare maximum bytes billed on a BigQuery job.
- Labels. Looker sends the
looker-context-*labels by default, and you can add your own through thelabelsJDBC parameter as URL-encoded key-value pairs. - Context comments are off for BigQuery connections by default, because Google says a comment in the SQL stops BigQuery from using cached results.
- OAuth connections are per user, so Looker’s own result cache works per user: a query run by one person isn’t reused for another.
- Persistent derived tables need a dataset Looker can write to and, with OAuth, a separate service account for the PDT jobs. PDT builds and trigger checks are queries you pay for, and the PDT override billing project lets you bill them elsewhere.
Tableau, Power BI and the drivers
Google documents two driver sets: its own JDBC and ODBC drivers (the ODBC driver is Apache 2.0 licensed), and the Simba drivers by insightsoftware. The drivers are query clients. The Simba drivers don’t support BigQuery load or export features, and all DML limitations apply.
From Google’s driver docs:
- Large results can be read with the Storage Read API instead of the query result API. In the Google JDBC driver this is off by default. It needs
EnableHighThroughputAPI, and kicks in aboveHighThroughputMinTableSize(default 10,000 rows) andHighThroughputActivationRatio(default 2 pages). The user needs the BigQuery Read Session User role. See Storage Read API. - The
Labelsconnection property tags every query the driver sends. Set it, so Tableau and Power BI jobs are attributable. We confirmed in Google’s docs that the property exists in the JDBC driver; the Simba ODBC options differ, so check your version’s documentation. - Tableau, Power BI and DBeaver turn autocommit off by default, which can trigger transaction statements. The ODBC driver has an
IgnoreTransactionsoption for this. - Power BI reports that refresh at the same moment through a Simba ODBC driver can fail with “Your user exceeded quota for concurrent project.lists requests”. Google’s fixes: stagger refreshes by a few minutes, turn on Power BI refresh retries, and set the project ID (the Catalog field) in the ODBC DSN so the driver stops listing projects.
Google’s own Tableau page is a BI Engine tutorial and doesn’t cover driver setup. For how a given tool connects, use the tool’s documentation.
What keeps dashboard costs down
The patterns repeat across tools:
- Make the same query repeat. Identical SQL within about 24 hours returns the stored result free. We checked what breaks it with three runs of one query: ending it with
/* a */and then/* b */gavecacheHitfalse both times, and a second run ending with/* b */gavecacheHittrue. A comment is part of the query text, so a tool that adds a changing comment, like a user ID or timestamp, will never hit the cache. - Cut the data a chart reads. Partition by the dashboard’s date field, cluster by its common filters, and point the tool’s date filter at the partition column. Pre-aggregate with a materialized view or a summary table so a chart reads thousands of rows, not billions.
- Cap freshness. In Data Studio, use the longest freshness window the report can live with, and a reusable data source with owner’s credentials so refreshes happen once.
- Use an extract for small, rarely changing data (Data Studio) so the report doesn’t query BigQuery at all.
- Accelerate with BI Engine when many users hit the same tables. BI Engine is an in-memory layer you rent by the gibibyte, and Google says it works with Looker, Data Studio, Tableau and Power BI through the API and drivers without code changes. It has limits (no wildcard tables, external tables, row-level security, JSON columns). See BI Engine.
- Label and cap. Add labels in every tool that allows it, put BI traffic in its own project or reservation, and set maximum bytes billed. See labels and billing export and controlling costs.
Which to choose
| You want | Use |
|---|---|
| Finance or sales teams slicing a big table without SQL | Connected Sheets, with a dedicated billing project and a scheduled refresh you can afford |
| Free, shareable dashboards on BigQuery | Data Studio, owner’s credentials plus a service account, freshness set deliberately |
| A governed semantic layer for many teams | Looker, with labels and Max Billing Gigabytes set |
| An existing Tableau or Power BI estate | their connectors or the Google drivers, with labels set and refreshes staggered |
| Sub-second dashboards with many viewers | any of the above plus BI Engine |