Lewati ke konten utama

dbt Snapshot: Tutorial Komprehensif

Pelajari apa itu dbt snapshot, cara membuatnya, dan cara mengonfigurasinya untuk melacak perubahan data Anda dalam tutorial ini.
Diperbarui 28 Sep 2026  · 9 mnt Baca

Jelajahi bersama AI

ChatGPTClaudePerplexity

dbt (data build tool) adalah alat yang tangguh yang digunakan analis data dan engineer untuk mentransformasi, menguji, dan mendokumentasikan data dalam modern data stack. 

Meskipun dikenal luas karena kemampuan pemodelannya, fitur penting lainnya adalah dbt snapshot, yang memungkinkan Anda menangkap slowly changing dimensions (SCD) di gudang data Anda.

Tutorial ini akan memberikan penjelasan mendalam tentang dbt snapshots, kasus penggunaannya, dan implementasinya. Saya akan:

  • Mendefinisikan apa itu dbt snapshots.
  • Menjelaskan kapan dan mengapa menggunakan snapshot.
  • Mengimplementasikan snapshot langkah demi langkah.
  • Memvisualisasikan data snapshot.
  • Berbagi beberapa praktik terbaik dan tantangan.

Untuk mempelajari lebih lanjut tentang dbt, pastikan untuk membaca panduan kami What is dbt? A Hands-On Introduction for Data Engineers dan kursus Introduction to dbt.  

Apa itu dbt Snapshots?

dbt snapshot adalah mekanisme untuk melacak perubahan pada rekaman dari waktu ke waktu, terutama untuk tabel yang secara bawaan tidak menyimpan riwayat perubahan. Snapshot terutama digunakan untuk mengimplementasikan Slowly Changing Dimensions (SCD) Tipe 2. Mereka menyimpan versi baris ketika kolom yang dipantau berubah. 

Contoh kasus penggunaan:

  • Melacak perubahan profil pelanggan dari waktu ke waktu.
  • Memantau perubahan status dalam data operasional.
  • Mencatat evolusi atribut dimensi untuk pelaporan historis yang akurat.

Mengapa Menggunakan dbt Snapshots? Manfaat dan Kasus Penggunaan

dbt snapshots bermanfaat karena berfungsi sebagai catatan perubahan data dari waktu ke waktu, memungkinkan analisis historis dan pelaporan kepatuhan.

Manfaat

Berikut beberapa manfaat yang Anda dapatkan saat menggunakan Snapshot:

  • Analisis tren: Memahami bagaimana perilaku, atribut, atau status pelanggan berkembang.
  • Audit & kepatuhan: Menunjukkan status data historis kepada auditor atau regulator.
  • Debugging data pipeline: Mengidentifikasi kapan suatu rekaman berubah secara tak terduga untuk menelusuri masalah.

Kasus Penggunaan Umum

Snapshot dapat berguna dalam beberapa situasi khusus, seperti:

  • Melacak peningkatan keanggotaan dalam program loyalitas.
  • Merekam riwayat harga untuk produk ritel.
  • Menangkap perubahan departemen karyawan dalam sistem HR.

Landasan Arsitektural

Snapshot terintegrasi mulus dalam ekosistem dbt, memanfaatkan konfigurasi dan manajemen run-nya untuk membangun tabel historis secara efisien.

Mari kita lihat jenis model yang digunakan dalam data sebagai contoh.

Ada dua model yang digunakan untuk data:

  • Model standar: Mentransformasi data untuk membuat tabel kondisi saat ini.
  • Model snapshot: Membuat tabel versi untuk melacak perubahan historis.

Kedua model ini berbeda dalam tujuan, metode penyimpanan, dan penerapannya.

Berikut ringkasan perbedaannya:

Fitur

Model Standar

Snapshot

Tujuan

Transformasi kondisi saat ini

Pelacakan historis

Penyimpanan

Tabel atau view dengan data saat ini

Tabel riwayat append-only

Terbaik Untuk

Model fakta/dimensi

Slowly changing dimensions

Cara Kerja dbt Snapshots

Secara umum, snapshot mengikuti alur kerja terstruktur yang memastikan semua perubahan ditangkap secara sistematis, meliputi langkah-langkah berikut:

  1. Konfigurasi: Tentukan strategi snapshot, kunci unik, dan kolom pendeteksi perubahan.
  2. Eksekusi: Jalankan dbt snapshot untuk membandingkan data saat ini dengan snapshot yang ada.
  3. Penyimpanan: dbt menyisipkan rekaman baru untuk perubahan yang terdeteksi, memperbarui timestamp validitas.

Namun bagaimana perubahan dilacak di dbt?

Semua perubahan dicatat dalam tabel Snapshot keluaran.

Jika perubahan terdeteksi, dbt memperbarui kolom dbt_valid_to untuk versi sebelumnya ke timestamp saat ini dan menyisipkan baris baru dengan kolom dbt_valid_from sebagai timestamp saat ini.

Strategi Snapshot di dbt

Snapshot menggunakan dua strategi utama untuk mendeteksi perubahan.

1. Strategi timestamp

  • Definisi: Menggunakan kolom timestamp untuk mendeteksi perubahan.
  • Kapan digunakan: Tabel sumber memiliki timestamp updated_at yang andal.

2. Strategi check

  • Definisi: Membandingkan kolom-kolom tertentu secara langsung.
  • Kapan digunakan: Tabel sumber tidak memiliki timestamp yang andal, tetapi perubahan atribut perlu dilacak.

Strategi

Metode Deteksi

Terbaik Untuk

Timestamp

Kolom updated timestamp

Tabel dengan timestamp last-modified yang andal

Check

Perbandingan langsung kolom

Tabel tanpa kolom timestamp

Hard Delete

Perubahan data, seperti penghapusan, juga dapat dilacak, tetapi tidak secara bawaan. Namun, ada cara untuk mengubah itu agar dapat memantau perubahan hard delete tersebut.

  • Masalah: Snapshot tidak melacak baris yang dihapus secara default.
  • Solusi: Atur invalidate_hard_deletes=True untuk menandai baris yang dihapus dengan nilai dbt_valid_to, sehingga status terakhirnya tetap tersimpan.

Berikut contoh implementasi strategi check sambil memperhitungkan hard delete:

{%
  snapshot customers_snapshot %}

{%
  set config(
    target_schema='snapshots',
    unique_key='customer_id',
    strategy='check',
    check_cols=['tier'],
    invalidate_hard_deletes=True
  )
%}

SELECT * FROM {{ source('customers') }}

{% endsnapshot %}

Panduan Implementasi dbt Snapshots

Sekarang setelah kita memahami cara kerja dbt Snapshots, mari kita lihat cara mengimplementasikannya 

1. Dataset contoh untuk tutorial Snapshot

Untuk berlatih snapshot, kita akan membuat tabel customers contoh yang meniru sistem keanggotaan dunia nyata. Ini memberi kita data konkret untuk menguji strategi snapshot umum.

import csv
from datetime import datetime

# Define the data
customers_data = [
    ["customer_id", "name", "tier", "updated_at"],  # header row
    [1, "Alice Tan", "Silver", "2025-07-01 10:00:00"],
    [2, "Bob Lee", "Gold", "2025-07-01 10:00:00"],
    [3, "Cheryl Lim", "Silver", "2025-07-01 10:00:00"]
]

# Write data to customers.csv
with open("customers.csv", mode="w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerows(customers_data)

2. Menyiapkan proyek dbt Anda

Sebelum Anda dapat mengimplementasikan snapshot, penting untuk menyiapkan proyek dbt dengan benar. Ini memastikan lingkungan Anda dikonfigurasi untuk mengelola model, snapshot, pengujian, dan dokumentasi secara terstruktur dan dapat diskalakan.

Prasyarat

  • Pastikan Anda telah menginstal Python 3.7+.
  • Instal dbt menggunakan pip:
pip install dbt

Ganti dbt-postgres dengan adapter gudang data Anda, misalnya dbt-snowflake atau dbt-bigquery, sesuai lingkungan Anda.

Instruksi penyiapan langkah demi langkah

1. Arahkan ke direktori proyek yang Anda inginkan.

Di sinilah Anda akan menyimpan proyek analitik atau ELT Anda. Dalam kasus ini, kita akan menyimpan semua berkas terkait dalam folder proyek dbt ini.

cd ~/dbt-snapshot-project

2. Inisialisasi proyek dbt baru.

Buat berkas konfigurasi bernama dbt_project.yml:

Tempelkan hal berikut ke dalam berkas proyek Anda:

name: dbt_snapshots_project
version: '1.0'
profile: austinchia

seeds:
  dbt_snapshots_project:
    +quote_columns: false

3. Uji koneksi Anda.

dbt debug

Ini seharusnya menjadi keluaran perintah:

dbt debug output

4. Muat seed ke dalam basis data lokal.

Jalankan perintah berikut:

dbt seed

Ini seharusnya menjadi keluaran perintah:

dbt seed output

5. Konfigurasikan pengaturan koneksi basis data Anda

Di berkas profiles.yml, biasanya terletak di ~/.dbt/profiles.yml.

Berikut isi berkas profil saya:

austinchia:
  target: dev
  outputs:
    dev:
      type: sqlite
      threads: 1
      database: ./dbt_snapshots_project.db
      schema: main
      schema_directory: ./schemas
      schemas_and_paths:
        main: ./dbt_snapshots_project.db
      extensions:
        - "C:/sqlean/crypto.dll"

Jika Anda menggunakan basis data SQLite seperti saya, Anda juga perlu memasang ekstensi SQLean.

6. Masukkan data Anda ke dalam model staging dbt:

Buat folder baru bernama models. Di dalam folder tersebut, buat berkas bernama stg_customers.sql.

Tempelkan kode berikut ke dalam berkas:

SELECT
  *
FROM {{ ref('customers') }}

7. Bangun model staging menggunakan perintah berikut di dbt.

dbt run --select stg_customers

Ini seharusnya menjadi keluaran perintah:

dbt staging output

3. Mengonfigurasi dbt Snapshot

  1. Buat direktori snapshots/.
  2. Tulis berkas SQL snapshot Anda dengan konfigurasi yang tepat.

Untuk contoh ini, Anda dapat menggunakan kode berikut untuk melakukan snapshot dengan strategi timestamp.

{% snapshot customers_snapshot %}

{{
  config(
    target_schema='snapshots',
    unique_key='customer_id',
    strategy='timestamp',
    updated_at='updated_at'
  )
}}

select * from {{ ref('customers') }}

{% endsnapshot %}

4. Menjalankan dbt Snapshot

Eksekusi:

dbt snapshot

Dalam perintah ini, dbt membuat tabel snapshot jika belum ada. dbt juga menyisipkan baris baru untuk perubahan yang terdeteksi.

Ini seharusnya menjadi keluaran perintah:

dbt snapshot output

5. Memeriksa Tabel Snapshot

Sekarang setelah Anda melakukan snapshot, Anda akan mendapatkan berkas snapshot.db baru yang dibuat di direktori berkas proyek Anda.

Saya membuka ini di VSCode untuk melihat seperti apa isi berkas tersebut:

snapshot table

Seperti yang Anda lihat, ini berisi kolom tambahan seperti dbt_updated_at dan seterusnya. Kolom-kolom ini krusial untuk menentukan apakah ada perubahan pada data dan kapan perubahan tersebut terjadi.

Untuk panduan praktis lainnya tentang dbt, lihat panduan Semantic Layer with dbt kami.

Contoh: Melacak Perubahan Data dengan dbt Snapshots

Snapshot memungkinkan tim menangkap jejak audit lengkap atas perubahan pada atribut apa pun dalam sebuah tabel dari waktu ke waktu, menjadikannya kuat untuk kepatuhan, debugging, dan analitik.

  1. Buat tabel customers contoh dengan kolom yang relevan. Ini mencakup ID pelanggan, nama, email, dan timestamp updated_at untuk melacak kapan perubahan terjadi.
CREATE TABLE customers (
    customer_id INTEGER PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    updated_at TIMESTAMP
);
  1. Sisipkan data awal untuk mensimulasikan kondisi dasar.

Gunakan kode berikut untuk menyisipkan data ke dalam tabel. Data ini akan digunakan sebagai data asli sebelum perubahan.

INSERT INTO customers VALUES 
(1, 'Alice Tan', 'alice@example.com', '2025-07-01 10:00:00'),
(2, 'Bob Lee', 'bob.lee@example.com', '2025-07-01 10:00:00');
  1. Tulis konfigurasi dbt snapshot untuk melacak perubahan email:
{% snapshot customers_email_snapshot %}

{%
  set config(
    target_schema='snapshots',
    unique_key='customer_id',
    strategy='check',
    check_cols=['email'],
    invalidate_hard_deletes=True
  )
%}

SELECT * FROM {{ source('customers') }}

{% endsnapshot %}
  1. Jalankan dbt snapshot untuk merekam kondisi awal.
dbt snapshot
  1. Simulasikan pembaruan email di tabel sumber.

Selanjutnya, kita akan memperbarui tabel asli dengan memodifikasi informasi salah satu pelanggan untuk mensimulasikan perubahan data.

UPDATE customers
SET email = 'alice.tan@example.com', updated_at = '2025-07-02 09:00:00'
WHERE customer_id = 1;
  1. Jalankan dbt snapshot lagi untuk menangkap perubahan.
dbt snapshot
  1. Kueri tabel snapshot.

Untuk melihat perbedaan dan perubahan yang dibuat pada data, Anda harus melakukan kueri pada tabel snapshot. Tabel akan menampilkan kedua versi alamat email beserta jendela validitas masing-masing:

SELECT customer_id, email, dbt_valid_from, dbt_valid_to
FROM snapshots.customers_email_snapshot
ORDER BY customer_id, dbt_valid_from;

Proses ini memastikan Anda menyimpan riwayat perubahan lengkap untuk pembaruan email, yang krusial untuk audit GDPR, pelacakan riwayat kontak, atau analitik dukungan pelanggan.

Konfigurasi dan Manajemen Lanjutan

Manajemen konfigurasi yang efektif memungkinkan tim untuk menskalakan implementasi snapshot di seluruh proyek dan lingkungan dengan mulus.

1. Konfigurasi tingkat proyek dan tingkat resource

  • Konfigurasi tingkat proyek: Gunakan dbt_project.yml untuk menetapkan konfigurasi snapshot default, seperti target schema atau materialization, yang berlaku untuk semua snapshot.
  • Konfigurasi tingkat resource: Timpa pengaturan dalam berkas SQL snapshot individual untuk kebutuhan spesifik, memastikan fleksibilitas.

2. Menyesuaikan kolom metadata

Secara default, dbt membuat kolom dbt_valid_from dan dbt_valid_to. Anda dapat mengganti namanya menggunakan opsi konfigurasi valid_from dan valid_to jika standar tim Anda memerlukan konvensi penamaan berbeda demi kejelasan di alat BI atau tata kelola data.

3. Migrasi konfigurasi Snapshot lama

Migrasi dapat menimbulkan ketidaksesuaian jika tidak ditangani dengan benar. Berikut beberapa hal yang perlu diperhatikan saat Anda memigrasikan konfigurasi snapshot:

  1. Identifikasi definisi snapshot lama yang menggunakan gaya blok konfigurasi usang.
  2. Refactor ke konfigurasi berbasis YAML jika menggunakan versi dbt modern demi konsistensi.
  3. Validasi kebenaran:
    • Jalankan snapshot di lingkungan pengujian.
    • Bandingkan keluaran sebelum memensiunkan snapshot lama.
  4. Decommissioning: Hapus berkas snapshot lama dan sesuaikan dokumentasi.

4. Integrasi dengan alat lain

Perubahan data dapat dilacak selaras dengan dbt snapshot. 

Sebagai contoh:

  • Alat BI (mis., Power BI, Tableau): Bangun visualisasi temporal yang menampilkan perubahan atribut dari waktu ke waktu.
  • Platform observabilitas (mis., Monte Carlo, Datafold): Pantau kesegaran data dan integritas historis.
  • Katalog data (mis., Alation, Collibra): Sertakan tabel riwayat snapshot sebagai artefak lineage terdokumentasi untuk kepatuhan.

Praktik Terbaik untuk Implementasi Produksi

Mengimplementasikan dbt snapshot di produksi memerlukan perancangan yang matang untuk memastikan kinerja, keterkelolaan, dan nilai bisnis.

Sebaiknya ikuti hal-hal berikut:

1. Kasus penggunaan optimal dan pemilihan tabel

  • Prioritaskan tabel dimensi dengan atribut yang berubah secara perlahan seperti profil pelanggan, data master produk, dan kontrak pemasok.
  • Hindari tabel transaksional (mis., item baris pesanan) dengan frekuensi insert dan update tinggi kecuali diperlukan karena kekhawatiran pertumbuhan penyimpanan yang cepat.

2. Teknik optimasi kinerja

Di produksi, Anda ingin mengoptimalkan data sehingga perubahan data dapat dilacak secara efisien tanpa memengaruhi produk Anda.

Berikut beberapa tips:

  • Pengindeksan: Tambahkan indeks pada unique_key dan kolom validitas untuk kueri yang lebih cepat.
  • Partisi: Partisikan tabel snapshot berdasarkan tanggal untuk mengoptimalkan kinerja pemindaian.
  • Clustering (spesifik gudang data): Gunakan kunci clustering (mis. di BigQuery) pada kolom ber-cardinality tinggi untuk meningkatkan kecepatan kueri filter.

3. Praktik pemeliharaan dan pemantauan

  • Penjadwalan: Jalankan snapshot pada jam non-sibuk untuk meminimalkan dampak biaya komputasi.
  • Pemantauan: Siapkan peringatan untuk kegagalan snapshot di dbt Cloud atau alat orkestrasi Anda.
  • Pemeriksaan kesegaran data: Gunakan pengujian dbt atau alat observabilitas untuk memvalidasi kesegaran data snapshot.
  • Analisis penyimpanan: Secara berkala tinjau ukuran tabel snapshot dan pangkas data historis jika bisnis mengizinkan.

4. Jebakan umum

Menggunakan unique_key yang tidak unik menyebabkan versioning baris yang salah. Selalu uji logika keunikan sebelum deployment. 

Snapshot bloat juga dapat terjadi ketika menyimpan perubahan historis yang tidak perlu (mis., kolom dengan pembaruan timestamp yang sering) dapat meningkatkan biaya penyimpanan dengan cepat.

Tantangan Umum dan Solusinya

Menggunakan Snapshot di dbt mungkin hadir dengan beberapa tantangan teknis spesifik:

1. Tabrakan kunci unik

Masalah: Baris duplikat dalam snapshot karena kunci unik yang didefinisikan buruk.

Solusi:

  • Validasi keunikan menggunakan pengujian dbt sebelum deployment snapshot.
  • Konkatenasi beberapa kolom untuk memastikan keunikan komposit jika diperlukan.

2. Kinerja kueri temporal

Masalah: Kueri lambat saat menganalisis data historis.

Solusi:

  • Gunakan partisi dan clustering gudang data secara efektif.
  • Selalu filter kueri berdasarkan dbt_valid_from atau rentang tanggal untuk mengurangi volume data yang dipindai.

3. Menangani error eksekusi Snapshot

Masalah umum meliputi:

  • Skema atau izin basis data yang salah.
  • Perubahan skema tabel sumber (mis. kolom dihapus) yang merusak pernyataan snapshot SELECT.
  • Kesalahan sintaks dalam blok konfigurasi snapshot.

Solusi:

  • Gunakan dbt debug untuk memvalidasi koneksi dan konfigurasi.
  • Implementasikan pengujian CI di dbt untuk menangkap error sebelum deployment.
  • Tinjau log run dbt untuk pesan error yang detail.

Kesimpulan

dbt snapshots memberdayakan tim analitik untuk membangun dataset historis yang andal dengan overhead rekayasa minimal, memungkinkan analitik kepatuhan. Jika Anda tertarik mempelajari lebih lanjut tentang dbt, lihat kursus kami Introduction to dbt. Untuk bacaan dan panduan lainnya, lihat Introduction to The dbt-utils Package dan dbt Tutorial.

dbt Snapshot FAQs

Bagaimana cara mengonfigurasi dbt snapshot untuk strategi data yang berbeda?

Untuk mengonfigurasi dbt snapshot untuk strategi data yang berbeda, Anda memilih antara strategi timestamp dan check dalam konfigurasi snapshot Anda. Untuk strategi timestamp, tentukan strategy='timestamp' dan sediakan kolom updated_at yang andal diperbarui pada setiap perubahan. Untuk strategi check, gunakan strategy='check' dan definisikan check_cols dengan daftar kolom yang dipantau perubahannya.

Apa praktik terbaik untuk penjadwalan dbt snapshot?

Jadwalkan snapshot pada jam non-sibuk, selaraskan frekuensinya dengan laju perubahan data, gunakan orkestrator seperti Airflow atau dbt Cloud, jalankan terpisah dari transformasi berat, dan pantau secara rutin untuk error.

Bagaimana saya dapat menyesuaikan kolom metadata dalam dbt snapshot?

Anda dapat mengganti nama kolom metadata default seperti dbt_valid_from dan dbt_valid_to di konfigurasi snapshot dan menambahkan metadata kustom menggunakan konfigurasi meta di YAML agar selaras dengan standar data Anda.

Apa perbedaan antara strategi timestamp dan check dalam dbt snapshot?

Timestamp menggunakan kolom updated_at untuk mendeteksi perubahan apa pun, sedangkan check membandingkan kolom tertentu untuk perbedaan; timestamp lebih sederhana, sementara check memberi kontrol lebih saat tidak ada timestamp andal.

Bagaimana cara menangani rekaman yang dihapus dalam dbt snapshot?

Gunakan invalidate_hard_deletes=True sehingga dbt menandai rekaman yang hilang dengan tanggal akhir pada periode validitasnya, sehingga penghapusan efektif tertangkap dalam riwayat snapshot Anda.


Austin Chia's photo
Author
Austin Chia
LinkedIn

Saya Austin, seorang blogger dan penulis teknologi dengan pengalaman bertahun-tahun sebagai data scientist dan analis data di bidang kesehatan. Memulai perjalanan teknologi dengan latar belakang biologi, kini saya membantu orang lain melakukan transisi yang sama melalui blog teknologi saya. Ketertarikan saya pada teknologi mendorong kontribusi tulisan saya untuk puluhan perusahaan SaaS, menginspirasi orang lain dan membagikan pengalaman saya.

Topik
dbt
Rekayasa Data

Kursus Teratas DataCamp

Kursus

Pengantar dbt

4 jam
34K
Kursus ini memperkenalkan dbt untuk pemodelan data, transformasi, pengujian, dan pembuatan dokumentasi.
Lihat DetailRight Arrow
Mulai Kursus
Lihat SelengkapnyaRight Arrow
Terkait

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

blogs

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

blogs

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

blogs

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

Lihat SelengkapnyaLihat Selengkapnya