Skip to content

Cum să creezi modele efemere (CTE) în dbt

DodaTech Updated 2025-01-15 2 min read

In this tutorial, you'll learn about Cum să creezi modele efemere (CTE) în dbt. We cover key concepts, practical examples, and best practices.

Vei învăța cum să creezi modele efemere (ephemeral) în dbt — modele care devin CTE-uri în query-urile modelelor dependente, fără a ocupa spațiu în baza de date.

Problema

Transformările intermediare repetate în mai multe modele duc la duplicarea codului SQL. Modelele efemere rezolvă această problemă ca CTE-uri reutilizabile fără stocare fizică.

Modul Greșit

-- models/order_summary.sql — CTE duplicat în mai multe modele
WITH cleaned_orders AS (
    SELECT * FROM orders WHERE status IS NOT NULL
)
SELECT user_id, COUNT(*) FROM cleaned_orders GROUP BY user_id;
-- models/user_metrics.sql — același CTE copiat
WITH cleaned_orders AS (  -- Duplicat!
    SELECT * FROM orders WHERE status IS NOT NULL
)
SELECT user_id, SUM(total) FROM cleaned_orders GROUP BY user_id;

Modul Corect

-- models/cleaned_orders.sql — model efemer
{{ config(materialized='ephemeral') }}

SELECT *
FROM {{ source('raw', 'orders') }}
WHERE status IS NOT NULL
  AND total > 0
-- models/order_summary.sql — reutilizare
SELECT
    user_id,
    COUNT(*) AS order_count
FROM {{ ref('cleaned_orders') }}
GROUP BY user_id
-- models/user_metrics.sql — reutilizare același CTE
SELECT
    user_id,
    SUM(total) AS total_revenue
FROM {{ ref('cleaned_orders') }}
GROUP BY user_id
dbt compile --model order_summary

Output compilat (SQL generat):

-- target/compiled/order_summary.sql
WITH cleaned_orders AS (
    SELECT * FROM raw.orders
    WHERE status IS NOT NULL AND total > 0
)
SELECT
    user_id,
    COUNT(*) AS order_count
FROM cleaned_orders
GROUP BY user_id;

Pas cu Pas

1. Configurează materializarea ephemeral

{{ config(materialized='ephemeral') }}
SELECT ... FROM {{ source('raw', 'table') }}

2. Referențiază modelul efemer

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

3. Rulează modelul părinte

dbt run --model order_summary
# cleaned_orders nu se execută separat — devine CTE în order_summary

Sfaturi de Prevenție

  • Folosește ephemeral pentru transformări simple și reutilizabile
  • Nu folosi ephemeral pentru modele referențiate de multe ori — CTE-ul se duplică în fiecare model părinte
  • Testează modelul ephemeral ca view în dezvoltare, apoi treci la ephemeral
  • Documentează modelele efemere ca atare

Greșeli Comune

  1. Ephemeral referențiat de prea multe modele — CTE-ul e duplicat, codul devine greu de citit
  2. Teste pe modele efemere — nu poți rula dbt test direct pe un model ephemeral
  3. Ref() către ephemeral din afara proiectului — cross-project ref nu suportă ephemeral
  4. Ephemeral prea complex — CTE-uri greu de citit și de depanat

Întrebări Frecvente

### Pot rula `dbt run` direct pe un model ephemeral?

Nu — dbt run --model cleaned_orders nu creează nimic. Modelul e injectat ca CTE doar când un model părinte îl referențiază.

Când să folosesc ephemeral vs view?

Folosește ephemeral când logica e folosită doar ca pas intermediar și nu trebuie interogată direct. Folosește view când modelul poate fi util și independent.

Cum depanez un model ephemeral?

Temporar, schimbă materializarea la view, rulează și inspectează datele. Apoi revino la ephemeral.

Construit de dezvoltătorii Doda Browser, DodaZIP și Durga Antivirus Pro. Instrumentele DodaTech se integrează perfect cu dbt pentru modele efemere eficiente.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro