Why advanced testing catches subtle data issues in dbt - Performance Analysis
We want to see how the time it takes to run advanced tests in dbt grows as data gets bigger.
How does adding more data affect the time to find subtle data problems?
Analyze the time complexity of the following dbt test code.
-- Advanced test to find subtle data issues
select
user_id,
count(*) as event_count
from {{ ref('events') }}
where event_type = 'purchase'
group by user_id
having count(*) < 5
This test checks users with fewer than 5 purchase events, catching rare or unusual patterns.
Look at what repeats as data grows.
- Primary operation: Scanning all event rows to filter and group by user_id.
- How many times: Once over all events, then grouping by each user.
As the number of events grows, the test scans more rows and groups more users.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 rows scanned and grouped |
| 100 | About 100 rows scanned and grouped |
| 1000 | About 1000 rows scanned and grouped |
Pattern observation: Operations grow roughly in direct proportion to data size.
Time Complexity: O(n)
This means the time to run the test grows linearly as the number of events increases.
[X] Wrong: "Advanced tests only add a small fixed time, no matter data size."
[OK] Correct: These tests scan and group all data, so more data means more work and longer time.
Understanding how test time grows helps you explain how to keep data quality checks efficient as data grows.
"What if we added a filter that only checks recent events? How would the time complexity change?"
Practice
Solution
Step 1: Understand the role of advanced testing
Advanced testing is designed to catch hidden or subtle data problems that basic tests do not detect.Step 2: Compare with other options
The other options describe unrelated or incorrect effects of advanced testing.Final Answer:
It finds subtle data issues that simple tests might miss. -> Option CQuick Check:
Advanced testing = finds subtle issues [OK]
- Thinking advanced tests speed up data loading
- Assuming advanced tests reduce database size
- Believing advanced tests fix errors automatically
Solution
Step 1: Review dbt test YAML syntax
Custom tests in dbt are defined with a name, test type, column, and optional severity in a list format.Step 2: Identify correct structure
tests: - name: unique_test test: unique column_name: id severity: error correctly uses a list item with name, test, column_name, and severity keys.Final Answer:
tests:\n - name: unique_test\n test: unique\n column_name: id\n severity: error -> Option DQuick Check:
Correct YAML list with keys = tests: - name: unique_test test: unique column_name: id severity: error [OK]
- Using incorrect YAML indentation
- Missing the 'name' key for the test
- Not using a list for multiple tests
SELECT user_id, COUNT(*)
FROM {{ ref('users') }}
GROUP BY user_id
HAVING COUNT(*) > 1Solution
Step 1: Understand the SQL query
The query groups rows by user_id and selects those with count greater than 1, meaning duplicates.Step 2: Determine output when duplicates exist
If duplicates exist, the query returns user_ids with more than one occurrence.Final Answer:
A list of user_ids that appear more than once -> Option AQuick Check:
GROUP BY + HAVING COUNT(*) > 1 = duplicates list [OK]
- Thinking COUNT(*) can't be used with GROUP BY
- Expecting total count instead of filtered duplicates
- Confusing empty result with error
email column, but it always passes even when nulls exist. What is the likely issue?Solution
Step 1: Analyze why nulls are not detected
COUNT(email) only counts non-null values, so tests relying on it will miss nulls and pass incorrectly.Step 2: Check other options
The other options cause different issues, like running on wrong data or incorrect test type.Final Answer:
The test is using COUNT(email) instead of COUNT(*) -> Option BQuick Check:
COUNT(email) ignores nulls [OK]
- Using COUNT(column) which ignores nulls
- Confusing schema and data tests
- Referencing wrong model in test
order_date is always before the ship_date. Which approach best catches subtle data issues?Solution
Step 1: Define the data rule to test
The rule is order_date must be before ship_date, so invalid rows have order_date >= ship_date.Step 2: Choose the test that finds violations
A SQL test selecting rows where order_date >= ship_date will catch subtle errors where dates are reversed or equal.Final Answer:
Write a SQL test that selects rows where order_date >= ship_date. -> Option AQuick Check:
Test selects invalid date order rows [OK]
- Using unique test which doesn't check date order
- Checking only for nulls misses order errors
- Counting rows doesn't validate date logic
Ready to prove it?
Pass the test and this pattern moves unknown
