dbt+SQLServer构建数据仓库(11):FAQ 篇

dbt+SQLServer构建数据仓库(11):FAQ 篇

从此篇开始,汇总dbt项目的常见问题,以此来巩固dbt的基础知识。


FAQ 1:staging 模型的中WITH的写法是固定的吗?

答:不是固定的,但遵循最佳实践。

stg_customers.sql 为例:

WITH source AS (
    SELECT *
    FROM {{ source('business_db', 'customers') }}
)

SELECT
    customer_id,
    customer_name,
    -- ... 其他字段
    'business_db' AS source_system,
    {{ get_current_load_date() }} AS load_date
FROM source

写法拆解

部分 作用 是否必须
WITH source AS (...) CTE {{ source() }} 引用源数据,解耦 推荐,非必须
明确列出所有字段 避免上游表结构变动带来意外 推荐
source_system 标记数据来源系统 按需添加
load_date 通过 macro 记录加载时间 按需添加

staging 层的"约定俗成"

  • 一个源表对应一个 stg 模型
  • 只做轻量转换(重命名、类型转换、简单清洗),不做聚合或关联
  • 命名统一:stg_<表名>
  • 配套 schema.yml 写测试和文档

FAQ 2:stg_customers.sql 最终会生成表吗?

答:会,但具体是表还是视图取决于 materialization 配置。

执行流程

stg_customers.sql
      ↓
 dbt compile(编译,展开 Jinja)
      ↓
 生成可执行 SQL
      ↓
 dbt run(执行)
      ↓
 在数据仓库中创建对象

编译后的 SQL 大致长这样:

WITH source AS (
    SELECT *
    FROM business_db.dbo.customers
)
SELECT
    customer_id,
    customer_name,
    -- ...
    'business_db' AS source_system,
    CURRENT_DATE AS load_date
FROM source

materialization 配置

dbt_project.yml 中:

models:
  dbt_sqldv:
    staging:
      +materialized: table    # 以表的形式落地
      +database: stage_db
      +schema: dbo

staging 层常见做法:数据量小用 view(省空间),数据量大或下游频繁查询用 table(加速)。本项目用的是 table。


FAQ 3:这段 SQL 就是 business_db → stage_db 的加载逻辑吗?

答:完全正确。这就是 ELT 中的 T(转换 + 搬运)。

数据流向

business_db.dbo.customers         ← 源数据库(OLTP)
        │  source() 引用
        ▼
stg_customers.sql                 ← dbt 模型
        │  dbt run 写入
        ▼
stage_db.dbo.stg_customers        ← staging 层

配置对应关系

配置位置 配置项 含义
schema.yml sources database business_db 数据来自这个库
dbt_project.yml staging +database stage_db 数据写入这个库
dbt_project.yml staging +materialized table 以表的形式落地
dbt_project.yml staging +schema dbo 放在 dbo 下

典型的 ELT 模式:数据已经在同一实例的不同库中,dbt 负责 SQL 转换和落地。


FAQ 4:怎么单独运行某一个模型?

答:用 --select 参数。

常用命令

# 只运行 stg_customers 这一个模型
dbt run --select stg_customers

# 运行 stg_customers 及其所有下游依赖(+ 号在右)
dbt run --select stg_customers+

# 运行 stg_customers 及其所有上游依赖(+ 号在左)
dbt run --select +stg_customers

# 运行整个 staging 目录
dbt run --select staging

其他常用操作

# 只编译不执行(查看生成的 SQL)
dbt compile --select stg_customers

# 运行该模型的测试
dbt test --select stg_customers

# 跑依赖 + 跑自己 + 跑测试(一条龙)
dbt build --select +stg_customers

编译后的 SQL 可以在 target/compiled/ 目录下找到,调试时很有用。


FAQ 5:执行 dbt run 时,模型的运行顺序是什么?

答:dbt 会自动构建 DAG(有向无环图),按拓扑顺序执行——上游先跑,下游后跑。

完整执行顺序(本项目)

第 1 批:Staging 层(3 个,可并行)

  • stg_customersstg_ordersstg_products
  • 都直接读源表,互相无依赖

第 2 批:Core 层 Hub(3 个,可并行)

  • hub_customerstg_customers
  • hub_orderstg_orders
  • hub_productstg_products

第 3 批:Core 层 Satellite + Link(4 个,可并行)

  • sat_customerhub_customer + stg_customers
  • sat_producthub_product + stg_products
  • sat_order_detailshub_order + stg_orders
  • link_order_customer_product ← 三个 hub + stg_orders

第 4 批:Mart 层维度表(3 个,可并行)

  • dim_customerhub_customer + sat_customer
  • dim_producthub_product + sat_product
  • dim_date(独立)

第 5 批:Mart 层事实表

  • fct_order

第 6 批:Mart 层宽表

  • dws_order_wide

关于并行

dbt 同一批次内无依赖的模型可以并行执行,并行度由 profiles.yml 中的 threads 控制:

dev:
  threads: 1   # 当前是串行,调大可加速

可视化依赖图

dbt docs generate && dbt docs serve

生成网页版的 DAG 图,所有依赖关系一目了然。


FAQ 6:如何在 dbt 中配置 stage / core / mart 三个独立数据库?

答:先在 SQL Server 中手动建好三个数据库,再在 dbt 中通过 +database 配置分层写入。dbt 本身不会自动创建数据库。

重要前提

dbt-core 没有 CREATE DATABASE 的原生能力,它只能在已经存在的数据库内部创建 schema、table、view 等对象。因此,stage_dbcore_dbmart_dw 这三个物理库,必须先在 SQL Server 中手动建好:

-- 在 SQL Server 中手动执行
CREATE DATABASE stage_db;
CREATE DATABASE core_db;
CREATE DATABASE mart_dw;

dbt 中的配置方法

dbt_project.yml 中,按目录层级分别指定 +database+schema

models:
  dbt_sqldv:
    staging:
      +materialized: table
      +database: stage_db    # 写入 stage_db
      +schema: dbo

    core:
      +materialized: table
      +database: core_db     # 写入 core_db
      +schema: dbo

    mart:
      +materialized: table
      +database: mart_dw     # 写入 mart_dw
      +schema: dbo

数据流向示意

business_db(源库,手动建)
     │
     ▼  source() 引用
stage_db(手动建)  ←  dbt 建表/视图
     │
     ▼  ref() 引用
core_db(手动建)   ←  dbt 建表/视图
     │
     ▼  ref() 引用
mart_dw(手动建)   ←  dbt 建表/视图

小结:Vibe Coding 的感受

这次用对话式 AI 辅助搭 dbt 数仓,几个比较深的体会:

  1. 搭建速度快:从 0 到有完整的三层架构(stg → core → mart),不用纠结模板代码,把精力放在设计上。
  2. 理解更深入:通过"提问 → 解答"的方式,对 dbt 的依赖解析、materialization、DAG 执行顺序这些核心概念理解得更扎实。
  3. FAQ 式学习有效:先动手做,做完再针对疑惑点追问,比从头到尾读文档效率高很多。

posted on 2026-08-13 16:57  哥本哈士奇(aspnetx)  阅读(2)  评论(0)    收藏  举报

导航