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_customers、stg_orders、stg_products- 都直接读源表,互相无依赖
第 2 批:Core 层 Hub(3 个,可并行)
hub_customer←stg_customershub_order←stg_ordershub_product←stg_products
第 3 批:Core 层 Satellite + Link(4 个,可并行)
sat_customer←hub_customer+stg_customerssat_product←hub_product+stg_productssat_order_details←hub_order+stg_orderslink_order_customer_product← 三个 hub +stg_orders
第 4 批:Mart 层维度表(3 个,可并行)
dim_customer←hub_customer+sat_customerdim_product←hub_product+sat_productdim_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_db、core_db、mart_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 数仓,几个比较深的体会:
- 搭建速度快:从 0 到有完整的三层架构(stg → core → mart),不用纠结模板代码,把精力放在设计上。
- 理解更深入:通过"提问 → 解答"的方式,对 dbt 的依赖解析、materialization、DAG 执行顺序这些核心概念理解得更扎实。
- FAQ 式学习有效:先动手做,做完再针对疑惑点追问,比从头到尾读文档效率高很多。
posted on 2026-08-13 16:57 哥本哈士奇(aspnetx) 阅读(2) 评论(0) 收藏 举报
浙公网安备 33010602011771号