BigQuery SQL and pricing model in GCP - Time & Space Complexity
We want to understand how the cost and time of running BigQuery SQL queries grow as the amount of data increases.
Specifically, how does scanning more data affect the number of operations and pricing?
Analyze the time complexity of running a simple SELECT query scanning a large table.
SELECT user_id, COUNT(*) AS visits
FROM `project.dataset.web_logs`
WHERE event_date BETWEEN '2024-01-01' AND '2024-01-31'
GROUP BY user_id
ORDER BY visits DESC
LIMIT 10
This query scans web log data for one month, groups by user, and returns the top 10 visitors.
Look at what happens repeatedly during query execution.
- Primary operation: Scanning data blocks from storage.
- How many times: Once for each data block covering the date range scanned.
- Secondary operations: Grouping and sorting happen after scanning but depend on scanned data size.
As the amount of data scanned grows, the number of data blocks read grows roughly in proportion.
| Input Size (GB scanned) | Approx. Data Blocks Read |
|---|---|
| 10 | 10 blocks |
| 100 | 100 blocks |
| 1000 | 1000 blocks |
Pattern observation: The scanning cost grows linearly with the amount of data scanned.
Time Complexity: O(n)
This means the time and cost increase directly in proportion to the size of the data scanned.
[X] Wrong: "Query cost stays the same no matter how much data is scanned."
[OK] Correct: BigQuery charges and time depend on how much data the query reads, so scanning more data costs more time and money.
Understanding how query cost grows with data size helps you design efficient queries and manage cloud costs wisely.
What if we added a filter that reduces scanned data by half? How would the time complexity and cost change?
Practice
Solution
Step 1: Understand BigQuery pricing basics
BigQuery charges based on how much data your query scans, not on commands or tables.Step 2: Identify the correct pricing factor
The cost depends on the volume of data scanned during query execution.Final Answer:
The amount of data scanned by the query -> Option AQuick Check:
Data scanned = cost [OK]
- Thinking cost depends on query complexity
- Assuming storage size affects query cost directly
- Confusing number of tables with cost
Solution
Step 1: Recall BigQuery SQL syntax
BigQuery uses standard SQL syntax where SELECT is used to retrieve data.Step 2: Identify the correct syntax
OnlySELECT * FROM dataset.table;uses the correct SELECT statement format with FROM clause.Final Answer:
SELECT * FROM dataset.table; -> Option AQuick Check:
SELECT + FROM = correct query [OK]
- Using GET or FETCH instead of SELECT
- Omitting FROM keyword
- Incorrect command verbs
SELECT COUNT(*) FROM `project.dataset.sales` WHERE sale_date >= '2023-01-01';What will this query return?
Solution
Step 1: Analyze the SELECT clause
COUNT(*) counts the number of rows matching the condition.Step 2: Understand the WHERE clause
It filters records with sale_date on or after 2023-01-01.Final Answer:
The total number of sales records from 2023-01-01 onwards -> Option CQuick Check:
COUNT(*) + WHERE = count filtered rows [OK]
- Confusing COUNT with SUM
- Thinking it returns all records instead of count
- Assuming date format causes error
SELECT * FROM dataset.table WHERE date = 2023-01-01;What is the error and how to fix it?
Solution
Step 1: Identify the error in WHERE clause
Date literals must be in quotes in SQL; missing quotes cause syntax error.Step 2: Correct the date format
Enclose date in single quotes: '2023-01-01' to fix the query.Final Answer:
Date value missing quotes; fix with WHERE date = '2023-01-01' -> Option BQuick Check:
Date literals need quotes [OK]
- Forgetting quotes around dates
- Assuming semicolon fixes syntax
- Thinking SELECT * is invalid
Solution
Step 1: Understand cost drivers in BigQuery
Costs depend on data scanned; scanning less data reduces cost.Step 2: Identify cost-saving technique
Partitioning tables lets queries scan only relevant partitions, saving cost.Final Answer:
Use partitioned tables and filter on partition column in queries -> Option DQuick Check:
Partition + filter = less data scanned [OK]
- Thinking scanning all data is cheaper
- Splitting tables without partitioning helps cost
- Using SELECT * increases scanned data
Ready to prove it?
Pass the test and this pattern moves unknown
