業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【データ基盤】
データハブとは
Ajust
データの保守運用
AI

執筆者:Handbook編集部

dbtのMaterializationについて

dbt の Materialization について

この記事では、dbt の Materialization について紹介します。

Materialization とは

モデルで定義された SELECT 文を実行した結果を、どのようにデータウェアハウスに保存しておくか指定する方法です。

Materialization の種類

Materialization にはviewtableephemeralincrementalの 4 種類があります。

View

SELECT 文をビューとして保存します。モデルは実行のたびにビューとして再構築されます。Materialization の指定がなければデフォルトで View になります。

info
備考
  • 基本的には View を使用し、パフォーマンスに問題が生じた場合にのみ他の Materializations に変更する
  • View は名前の変更やカラムの再構成など、大きな変換を行わないモデルに最適

Table

SELECT 文の実行結果をテーブルとして保存します。モデルは実行のたびにテーブルとして再構築されます。

info
備考
  • BI ツールから頻繁に参照するようなモデルの場合は、パフォーマンスの観点から実テーブルとして生成する
  • 処理が多段になるモデルのフローがある場合、パフォーマンスの観点からテーブルの実体化を使用する

Ephemeral

実行結果はデータウェアハウスには保存されませんが他のモデルから参照することができます。Ephemeral を指定したモデルは共通テーブル式(CTE)として扱います。

info
備考
  • 中間テーブルとして使用する
  • データウェアハウスに保存しておく必要がない場合に使用する

Incremental

SELECT 文の実行結果をテーブルとして保存しますが、テーブルの再構築はせず、前回実行時との差分に対してのみ更新を行います。 「前回実行時との差分」を特定するために そのロジックとis_incremental()というマクロの設定が必要であり、dbt の高度な使い方となります。

info
備考
  • インクリメンタルモデルはイベント形式のデータに最適
  • dbt の実行速度に問題がある場合に使用

以下はis_incremental()を使用した例になります。is_incrementalが True の場合にWHERE句が動作し、created_atについてのロジックにより前回実行時との差分を表現しています。

{{
    config(
        materialized='incremental'
    )
}}

SELECT
  xxx,
  yyy,
  zzz,
  created_at
FROM my_table

{% if is_incremental() %}
  WHERE created_at > (SELECT MAX(created_at) FROM {{ this }})
{% endif %}

Materialization の指定方法

Materialization は一括指定、個別指定の 2 種類の指定方法があります。

一括指定

dbt_project.ymlファイルに以下のように記述することで Materialization を指定することができます。今回の例ではstagingディレクトリにあるモデルはviewmartsディレクトリにあるモデルはtableになるようにしてしています。

models:
  my_project:
    staging:
      materialized: view
    marts:
      materialized: table

個別指定

モデルの SQL ファイルの中で直接 Materialization を指定することができます。一括指定がされている場合でも個別指定が優先されます。

{{ config(
    materialized='table'
  )
}}

SELECT
  *
FROM hoge

参考

info
備考

Hakky ではエンジニアを募集中です!まずは話してみたいなどでも構いませんので、ぜひお気軽に採用ページからお問い合わせくださいませ。

2025年07月03日に最終更新
読み込み中...