Error logs, compiled SQL, YAML issues, DAG failure troubleshooting, and dbt clone — the skills that separate experienced analytics engineers.
This combined domain covers how analytics engineers diagnose and fix problems — both in development (Domains 3) and in running data pipelines (Domain 4). Exam questions are scenario-based: "you see this error, what do you do?"
Reading and interpreting dbt log output and error messages
Using target/compiled to isolate whether issues are dbt or SQL
Diagnosing .yml compilation errors and schema mismatches
DAG failures, dbt clone, and integrated tool troubleshooting
The exam distinguishes between a pure SQL error (wrong query logic) and a dbt error that presents as SQL (e.g., wrong ref() causing a missing table). The diagnostic step is always: compile the model and run the compiled SQL directly in your warehouse to see if the SQL itself works.
logs/dbt.log and printed to the terminal during runs--warn-error to treat warnings as errorsdbt compile to generate compiled SQL without executing ittarget/compiled/[project]/models/[path]/model.sqlversion: 2 at the top of a schema file causes parsing failuresdbt parse — faster than running the full projectdbt retry — re-runs only the failed nodes and their downstream dependencies from the last run--select result:error+ to manually select all errored models and their childrendbt clone creates zero-copy clones of production models in a dev/CI schema without re-running transformationsdbt clone --select [models] with appropriate target configurationRecognizing error patterns is a core exam skill.
Cause: ref('Y') references a model that doesn't exist in the project, or the model name is misspelled.
Cause: A hardcoded table reference resolves to the wrong environment (dev vs prod), or the model hasn't been built yet.
Cause: Indentation error, wrong key name, or invalid YAML syntax in a schema file.
Cause: The incremental model added a new column, but the existing table in the warehouse doesn't have it.
Cause: A data test (e.g., not_null, unique) found violations in the model's output.
Cause: The CI environment doesn't have the production models that the changed model depends on.
Scenario-based questions — identify the error and pick the right fix.
Debugging is a hands-on skill — practice breaking and fixing things.
Skipped ≠ failed
When a model fails, downstream models are skipped (not failed). Candidates try to debug the skipped models instead of the actual failed upstream model.
Find the model marked as ERROR in the output (not SKIP/WARN). Fix that model first. The skipped models will resolve automatically on the next run.
Guessing at SQL logic without inspecting the compiled output
Developers modify the model.sql repeatedly without checking what the compiled SQL actually looks like, missing that the issue is a Jinja/ref() resolution problem, not their SQL logic.
Always run dbt compile first and inspect target/compiled/. The compiled SQL shows you exactly what dbt will execute — no guessing.
Using dbt run without --select
Running dbt run or dbt build without a --select flag rebuilds the entire project, wasting time and compute when you only changed one model.
Use dbt build --select model_name to build and test just the changed model. Add + modifiers if you need parents or children: +model_name+.
Clone doesn't execute transformations
Candidates think dbt clone builds/refreshes models. It doesn't — it creates a reference (or copy) of an existing materialized object without running the model SQL.
dbt clone copies existing materialized tables/views to a new schema. Use it to give your CI environment access to production data without re-running all transformations.
Schema changes break incrementals silently
Adding a new column to an incremental model causes a schema mismatch error because the existing table doesn't have the new column. The default behavior is 'ignore' — new columns are dropped.
Set on_schema_change: 'append_new_columns' to add new columns to the existing table, or run --full-refresh to rebuild the table with the updated schema.
target/compiled/[project_name]/models/[path]/model.sql. The directory structure mirrors your models/ folder. Run dbt compile to generate all compiled files without executing them against the warehouse.dbt retry is a convenience wrapper — it reads the last run's results from target/run_results.json and re-runs failed + skipped nodes automatically. --select result:error+ is the manual equivalent, giving you more control over which results to act on. Both achieve the same result but retry is faster for the common case.dbt compile --select model_name to generate the compiled SQL. Then copy the compiled SQL from target/compiled/ and run it directly in your warehouse query editor. If it runs successfully → the problem is in how dbt executes or connects. If it fails → the SQL logic is incorrect and needs to be fixed in your model.--select state:modified+. This ensures tests run on real-ish data without rebuilding the entire warehouse.--full-refresh causes dbt to drop and recreate the incremental model as if it were a table — ignoring the is_incremental() filter and building from all source data. Use it when you've made schema changes to the model or when you need to backfill historical data.