Query profiling and optimization in dbt - Time & Space Complexity
When we profile and optimize queries in dbt, we want to know how the time to run a query changes as the data grows.
We ask: How does the query's work increase when the input data gets bigger?
Analyze the time complexity of the following dbt SQL model.
select
user_id,
count(*) as total_orders
from {{ ref('orders') }}
where order_date >= '2023-01-01'
group by user_id
This query counts orders per user since the start of 2023.
Look for repeated work inside the query.
- Primary operation: Scanning all rows in the orders table after filtering by date.
- How many times: Once per row that matches the date filter.
As the number of orders grows, the query must check more rows and group them.
| Input Size (n) | Approx. Operations |
|---|---|
| 10,000 orders | About 10,000 row checks and grouping steps |
| 100,000 orders | About 100,000 row checks and grouping steps |
| 1,000,000 orders | About 1,000,000 row checks and grouping steps |
Pattern observation: The work grows roughly in direct proportion to the number of rows.
Time Complexity: O(n)
This means the query time grows linearly as the number of orders increases.
[X] Wrong: "Adding a WHERE filter always makes the query run in constant time."
[OK] Correct: The filter reduces rows but the query still scans all matching rows, so time grows with filtered data size.
Understanding how query time grows helps you write efficient dbt models and explain your choices clearly in interviews.
What if we added an index on order_date? How would the time complexity change?
Practice
What is the main purpose of query profiling in dbt?
Solution
Step 1: Understand the goal of query profiling
Query profiling is used to analyze how queries run and identify slow parts.Step 2: Match the purpose with the options
Only To find slow parts of your data queries describes finding slow parts, which is the main goal.Final Answer:
To find slow parts of your data queries -> Option CQuick Check:
Query profiling = find slow parts [OK]
- Confusing profiling with writing queries
- Thinking profiling creates dashboards
- Assuming profiling backs up data
Which of the following is the correct way to run a dbt model named sales_summary from the command line?
Solution
Step 1: Recall dbt command syntax for running models
The correct command uses 'dbt run --model <model_name>'.Step 2: Compare options with correct syntax
Only dbt run --model sales_summary matches the correct syntax exactly.Final Answer:
dbt run --model sales_summary -> Option BQuick Check:
Run model = dbt run --model [OK]
- Using 'dbt execute' which is invalid
- Omitting the '--model' flag
- Using wrong command order
Given this dbt model SQL snippet:
select customer_id, count(*) as order_count
from orders
group by customer_id
Which database command helps you understand why this query might be slow?
Solution
Step 1: Identify the tool for query profiling
The EXPLAIN command shows how the database runs a query and where it may be slow.Step 2: Match EXPLAIN with the given query
EXPLAIN SELECT customer_id, count(*) as order_count from orders group by customer_id uses EXPLAIN with the query, which helps understand performance.Final Answer:
EXPLAIN SELECT customer_id, count(*) as order_count from orders group by customer_id -> Option DQuick Check:
EXPLAIN = query profiling tool [OK]
- Using DESCRIBE which shows table structure only
- Using SHOW TABLES which lists tables
- Running SELECT without profiling
Look at this dbt model SQL snippet:
select * from orders where order_date = '2023-01-01'
After profiling, you see a full table scan causing slowness. What is the best fix?
Solution
Step 1: Understand cause of full table scan
Full table scans happen when no index supports the filter condition.Step 2: Choose optimization to speed up filtering
Adding an index on order_date helps the database find rows faster.Final Answer:
Add an index on the order_date column -> Option AQuick Check:
Index on filter column = faster queries [OK]
- Removing WHERE loses filtering purpose
- Selecting fewer columns doesn't fix scan
- Changing filter column arbitrarily
You have a dbt model joining two large tables:
select c.customer_id, sum(o.amount) as total
from customers c
join orders o on c.customer_id = o.customer_id
group by c.customer_id
Profiling shows the join is slow. Which optimization is best?
Solution
Step 1: Identify cause of slow join
Joins on large tables are slow if join keys lack indexes.Step 2: Apply indexing to join keys
Indexing customer_id on both tables speeds up join operations.Final Answer:
Ensure both customer_id columns are indexed -> Option AQuick Check:
Index join keys = faster joins [OK]
- Removing GROUP BY changes query meaning
- Using subqueries may not improve speed
- Adding LIMIT only reduces output, not join speed
Ready to prove it?
Pass the test and this pattern moves unknown
