Materializations decide how dbt saves your data models. They help you control when and where data is stored for faster analysis.
When you want to save a table permanently for repeated use.
When you need a temporary table for quick calculations during a run.
When you want to create a view that always shows fresh data without storing it.
When you want to incrementally add new data without rebuilding the whole table.
When you want to test or debug your models without saving results.
Syntax
dbt
materialized: [view|table|incremental|ephemeral]
materialized is a key in your model's config block.
You choose one of the options: view, table, incremental, or ephemeral.
Examples
This saves the model as a physical table in the database.
dbt
models/my_model.sql
{{ config(materialized='table') }}
select * from source_table
This creates a view that shows live data without storing it separately.
dbt
models/my_model.sql
{{ config(materialized='view') }}
select * from source_table
This adds only new or changed rows to the existing table, saving time.
dbt
models/my_model.sql
{{ config(materialized='incremental') }}
select * from source_table where updated_at > (select max(updated_at) from {{ this }})
This does not create a table or view but inlines the SQL into downstream models.
dbt
models/my_model.sql
{{ config(materialized='ephemeral') }}
select * from source_table
Sample Program
This model creates a table with only active customers for faster queries later.
dbt
-- models/example_model.sql
{{ config(materialized='table') }}
select id, name from raw.customers where active = true
OutputSuccess
Important Notes
Choosing the right materialization affects performance and storage costs.
Use incremental for large datasets that update often.
Ephemeral models are useful for reusable SQL snippets without extra tables.
Summary
Materializations control how dbt saves or shows your data models.
Common types are table, view, incremental, and ephemeral.
Pick the type based on your data size, update frequency, and performance needs.
Practice
(1/5)
1. What does the table materialization do in dbt?
easy
A. Runs the model only when data changes incrementally.
B. Creates a temporary view that disappears after the session ends.
C. Creates a physical table in the database that stores data permanently.
D. Does not create any database object but runs SQL inline.
Solution
Step 1: Understand table materialization
The table materialization creates a real table in the database that stores the data physically.
Step 2: Compare with other materializations
Unlike views or ephemeral models, tables persist data and improve query speed for large datasets.
Final Answer:
Creates a physical table in the database that stores data permanently. -> Option C
Quick Check:
table materialization = physical table [OK]
Hint: Tables store data physically; views do not [OK]
Common Mistakes:
Confusing tables with views
Thinking ephemeral models create tables
Assuming incremental means full table creation
2. Which of the following is the correct syntax to set a model as incremental in dbt?
easy
A. materialized: 'incremental'
B. materialization: 'incremental'
C. materialized = incremental
D. materialize: incremental
Solution
Step 1: Recall dbt model config syntax
In dbt, model materialization is set using materialized: 'type' inside the model config block.
Step 2: Identify correct syntax for incremental
The correct key is materialized with a colon and the value in quotes, like 'incremental'.
Final Answer:
materialized: 'incremental' -> Option A
Quick Check:
Use materialized: 'incremental' for incremental models [OK]
Hint: Use 'materialized' key with colon and quotes [OK]
Common Mistakes:
Using 'materialization' instead of 'materialized'
Missing quotes around 'incremental'
Using equals sign instead of colon
3. Given this dbt model config and SQL, what will be the result when run?
{% if is_incremental() %}
select * from source_table where updated_at > (select max(updated_at) from {{ this }})
{% else %}
select * from source_table
{% endif %}
Model config:
materialized: 'incremental'
medium
A. The model will fully refresh the table every run.
B. The model will fail due to syntax error.
C. The model will create a view instead of a table.
D. The model will add only new rows with updated timestamps.
Solution
Step 1: Understand the incremental logic in SQL
The SQL uses is_incremental() to run different queries: full select on first run, then only new rows after.
Step 2: Match with incremental materialization behavior
With materialized: 'incremental', dbt appends new rows where updated_at is greater than the max in the existing table.
Final Answer:
The model will add only new rows with updated timestamps. -> Option D
Quick Check:
Incremental model adds new rows only [OK]
Hint: Incremental models append new data, not full refresh [OK]
Common Mistakes:
Thinking incremental always refreshes full table
Confusing view creation with incremental
Ignoring the is_incremental() condition
4. You wrote this dbt model config:
materialized: incremental
What is the error and how to fix it?
medium
A. Wrong key name; fix: materialization: 'incremental'
B. Missing quotes around 'incremental'; fix: materialized: 'incremental'
C. Should use equals sign; fix: materialized = 'incremental'
D. No error; config is correct
Solution
Step 1: Identify syntax error in config
The value incremental must be a string, so it needs quotes.
Step 2: Correct the syntax
Change to materialized: 'incremental' to fix the error.
Final Answer:
Missing quotes around 'incremental'; fix: materialized: 'incremental' -> Option B
Quick Check:
Materialization values must be strings in quotes [OK]
Hint: Always quote materialization types [OK]
Common Mistakes:
Forgetting quotes around materialization type
Using wrong key 'materialization'
Using equals sign instead of colon
5. You have a large dataset that updates daily with new and changed rows. You want fast query performance and to avoid rebuilding the entire table each time. Which materialization strategy should you choose in dbt?
hard
A. Use incremental materialization to add and update rows efficiently.
B. Use table materialization and rebuild daily.
C. Use view materialization for real-time data.
D. Use ephemeral materialization to avoid creating tables.
Solution
Step 1: Analyze dataset size and update pattern
The dataset is large and updates daily with new and changed rows, so full rebuilds are costly.
Step 2: Match materialization to needs
incremental materialization updates only new or changed rows, improving performance and avoiding full rebuilds.
Final Answer:
Use incremental materialization to add and update rows efficiently. -> Option A
Quick Check:
Incremental = efficient updates for large, changing data [OK]