惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
小众软件
小众软件
博客园 - 叶小钗
宝玉的分享
宝玉的分享
博客园_首页
Hugging Face - Blog
Hugging Face - Blog
人人都是产品经理
人人都是产品经理
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
SegmentFault 最新的问题
B
Blog RSS Feed
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
Google DeepMind News
Google DeepMind News
U
Unit 42
F
Fortinet All Blogs
IT之家
IT之家
Y
Y Combinator Blog
Martin Fowler
Martin Fowler
T
The Blog of Author Tim Ferriss
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
Stack Overflow Blog
Stack Overflow Blog
Blog — PlanetScale
Blog — PlanetScale
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - 哥本哈士奇(aspnetx)

dbt+SQLServer构建数据仓库(13):运维 FAQ 篇 dbt+SQLServer构建数据仓库(12):进阶 FAQ 篇 dbt+SQLServer构建数据仓库(10):macro 以及 data vault的应用实例 dbt+SQLServer构建数据仓库(9):用Vibe Coding创建一个DBT UI dbt+SQLServer构建数据仓库(8):Vibe Coding用dbt构建data vault数仓 dbt+SQLServer构建数据仓库(7):进阶扩展 dbt+SQLServer构建数据仓库(6):Jinja与DAG实战 dbt+SQLServer构建数据仓库(5):数据测试 dbt+SQLServer构建数据仓库(4):分层建模实战 dbt+SQLServer构建数据仓库(3):dbt_project.yml配置精讲 dbt+SQLServer构建数据仓库(2):与传统方案对比及迁移决策 dbt+SQLServer构建数据仓库(1):认识dbt与项目工作流程 SQL Server 索引知识汇总 医疗器械行业 Salesforce Territory 完整落地实例 Raw Data Vault vs Business Data Vault Neo4j 多跳查询实战:从社交网络场景理解图遍历 Git 本地版本管理学习笔记 看完《低智商犯罪》,学习Cypher构建知识图谱 LangChain DeepAgents 学习笔记 LangChain Deepagent 版本0.6.1中间件一个bug Neo4j笔记(五):查询的处理流程 微软 SQL Server 版本演进史:从诞生到 SQL Server 2025 提升 Text2SQL 准确率 SQLServer Management Studio(SSMS) 22 Copilot 最佳实践学习笔记 SQLServer RAG笔记4:从服务层到前端交互 SQLServer RAG笔记5:为SQLServer 2025配置Ollama SQL Server RAG 笔记3:SQLServer2025 向量数据库 详解传统RAG、Text2SQL、Graph RAG:适用场景与问题示例汇总 SQL Server RAG 笔记2:图数据库服务层与前端可视化构建 SQL Server RAG 笔记1:图数据库构建
dbt+SQLServer构建数据仓库(11):FAQ 篇
哥本哈士奇(aspnetx) · 2026-08-13 · via 博客园 - 哥本哈士奇(aspnetx)

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 写测试和文档

答:会,但具体是表还是视图取决于 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 式学习有效:先动手做,做完再针对疑惑点追问,比从头到尾读文档效率高很多。