π Study asset for the dbt Analytics Engineering Certification Practice Tests course on Udemy β 195 exam-style questions across 3 timed tests, updated for dbt 1.11.
Hands-on experience is not enough to pass this exam. This is the #1 takeaway from everyone who's taken it. Even engineers with 2+ years of daily dbt use have failed. The exam tests features you may have never touched in your day-to-day work β snapshots, exposures, model governance, state selectors, Python models.
You need dedicated study time, not just "I use dbt at work."
-
Complete a dbt course
-
Read the official study guide β download it here. Map every bullet point to your personal experience. Mark topics you've never used.
-
Set up a practice project β Clone jaffle_shop and use it to test every feature you study.
Go through the dbt docs, reference, and guides for every exam topic:
Domain 1 β Developing and optimizing dbt models (biggest section)
- All 4 materializations: table, view, incremental, ephemeral
- Incremental strategies and when to pick which:
append,merge,delete+insert,insert_overwriteβ by warehouse and dataset shape - Microbatch materialization:
event_time,begin,batch_size,lookback; first-run backfill vs subsequent runs;--event-time-start/--event-time-endoverrides - Snapshots: YAML-based config (no more
models/snapshots/*.sqlstandalone), timestamp vs check strategy - Python models:
def model(dbt, session)syntax, when to use --emptyflag: zero-row dry-run; what it does and doesn't catch (data tests pass vacuously)--sampleflag: temporal-subset dry-run (e.g.--sample=last_day); propagates through the DAG- Sources config, seeds, packages,
dbt_project.yml - Documentation lives here in v1.11:
dbt docs generate, doc blocks ({% docs %}),persist_docs, descriptions in YAML generate_schema_nameandgenerate_database_namemacros
Domain 2 β Managing dbt models governance
- Contracts:
enforced: trueREQUIRES adata_typeon every column undercolumns:(parse-time failure if missing) - YAML column-level constraints:
primary_key,not_null,check(expression: "..."); know which warehouses enforce them at insert vs treat them as informational (e.g. Snowflake enforcesnot_nullonly) - Versions:
versions:config,deprecation_date,latest_version, version-lessref()resolution
Domain 3 β Debugging data modeling errors
- Error types: Compilation Error, Database Error, Runtime Error, Dependency Error
target/compiled/vstarget/run/β when to check each- YAML syntax errors (indentation, tabs vs spaces)
- Jinja compilation errors (undefined vars, missing
{% endif %}) - Behavior-change flags in
dbt_project.yml(flags:block) β e.g.require_explicit_package_overrides_for_builtin_materializations. Setting toFalsekeeps v1.7 behavior;Trueadopts the v1.11 strict default. Use to migrate gradually. dbt debugcommand
Domain 4 β Troubleshooting and optimizing dbt pipelines
dbt cloneβ zero-copy clones, supported materializationsdbt retryβ reads fromrun_results.json- DAG failure management
- Job optimization (threads, selectors)
Domain 5 β Implementing dbt tests
- Generic tests:
unique,not_null,accepted_values,relationships - Singular tests (.sql files in
tests/) - Custom generic tests (
{% test %}macro syntax) - Test severity:
warn_if,error_if,whereconfig store_failuresandstore_failures_as- Unit tests:
given/expectformat
Domain 6 β Implementing and Maintaining External Dependencies
- Exposures:
type,maturity,depends_on,ownerconfig - Source freshness:
loaded_at_field,warn_after,error_after packages.yml: hub vs git vs local packages, version pinning
Domain 7 β Leveraging the dbt state
- State artifacts:
manifest.json,run_results.json - State selectors:
state:modified,state:new,state:modified.body,state:modified.configs - Result selectors:
result:error,result:fail,result:warn --deferand--favor-stateflags- Slim CI workflow
dbt retry
This is a closed-book exam. You must memorize:
- Source YAML config (database, schema, tables, loaded_at_field, freshness)
- Model properties YAML (columns, tests, descriptions, contracts)
- Exposure YAML (type, maturity, depends_on, owner)
- Snapshot config block (strategy, unique_key, updated_at, check_cols, target_schema)
dbt_project.ymlstructure (name, version, profile, model-paths, materializations)- Incremental model config (materialized, unique_key, strategy, on_schema_change)
- Custom generic test macro syntax
Tip from Paul Fry (certified practitioner): "Are you confident of the varying config options available for dbt sources? Would you be able to write these from scratch?" If the answer is no, keep studying.
- Take our practice exams under timed conditions (90 minutes per test)
- Review every wrong answer thoroughly
- Read these critical blog posts:
These come up repeatedly:
| Function | Purpose |
|---|---|
ref('model_name') |
Reference another model, creates DAG dependency |
source('source', 'table') |
Reference a source table |
config(...) |
Set model configuration in-file |
var('var_name') |
Access project variables |
env_var('ENV_VAR') |
Access environment variables |
this |
Current model's relation |
target |
Current target (name, schema, type, threads) |
is_incremental() |
Check if running in incremental mode |
run_query(sql) |
Execute SQL during compilation |
log(msg, info=True) |
Print messages during compilation |
adapter.dispatch() |
Cross-database macro dispatch |
| Command | Purpose |
|---|---|
dbt run |
Build models |
dbt test |
Run tests |
dbt build |
Run + test in DAG order |
dbt compile |
Compile Jinja to SQL (no execution) |
dbt seed |
Load CSV seeds |
dbt snapshot |
Run snapshots |
dbt docs generate |
Generate documentation |
dbt source freshness |
Check source freshness |
dbt deps |
Install packages |
dbt debug |
Test connection + config |
dbt retry |
Re-run failed nodes from last run |
dbt clone |
Create zero-copy clones |
dbt ls |
List resources matching selectors |
dbt run-operation |
Run a macro directly |
| Selector | Meaning |
|---|---|
model_name |
Single model |
+model_name |
Model + all upstream |
model_name+ |
Model + all downstream |
+model_name+ |
Model + all upstream + all downstream |
tag:nightly |
All models tagged "nightly" |
source:jaffle_shop |
All sources in jaffle_shop |
state:modified |
Models modified since last run |
state:modified+ |
Modified models + their downstream |
result:error |
Models that errored on last run |
exposure:weekly_report |
Upstream of an exposure |
The exam is for "Analytics Engineering", not just dbt:
- Git:
git pullvsgit fetch, branching strategies, PR workflows - SQL: CTEs, window functions, aggregations, joins
- Jinja: Control structures (
{% if %},{% for %}), filters, variable scope - General software principles: DRY vs WET, modularity, naming conventions
- Read questions twice β Extra details are intentionally added to make you second-guess
- Watch out for DOMC format β You see options one at a time and must decide yes/no without seeing others
- Time management β 65 questions in 120 minutes = ~1.8 minutes per question. Skip and return to hard ones
- The exam includes unscored research questions β Some questions don't count toward your score, but you can't tell which ones
- 65% to pass β You can miss up to 23 questions and still pass. Don't panic
Updated to the 2026 dbt v1.11 Certification