白杨商业智能工作室
#技术分享#Power BI#Fabric#Direct Lake

Direct Lake 计算列(预览版)

· 白杨BI工作室

Direct Lake 自发布以来,一直是 OneLake 语义模型(Semantic Model)里性能与实时性兼顾的明星方案。但有一个缺口始终让分析师们挠头:想在模型里加一列派生字段,要么得回头改上游数据管道,要么就得把表切成 Import 或 DirectQuery 模式,绕一圈再回来。

Direct Lake 计算列(预览版)

Direct Lake 自发布以来,一直是 OneLake 语义模型(Semantic Model)里性能与实时性兼顾的明星方案。但有一个缺口始终让分析师们挠头:想在模型里加一列派生字段,要么得回头改上游数据管道,要么就得把表切成 Import 或 DirectQuery 模式,绕一圈再回来。现在这个缺口终于补上了——Direct Lake 计算列(Calculated Columns)进入预览阶段。

这不仅仅是补了个功能。它意味着你可以在不改变表存储模式、不触碰上游数据的前提下,直接用 DAX(数据分析表达式)在语义模型里定义新列。对于国内大量使用 Fabric 和 Power BI 的团队来说,这直接省掉了数据工程侧的反复沟通和排期,把建模的主动权真正交还给了分析师。

为什么这个功能等了这么久

Direct Lake 的底层逻辑是直接查询 OneLake 中的 Delta 表,按需将数据加载进内存,从而同时获得接近 Import 模式的查询速度和接近实时(near real-time)的数据新鲜度。但正因为它“不落地”数据,派生列的计算一直是个难题。

过去,如果你的模型需要一个从已有字段推导出来的新列,只有两条路:要么把逻辑下沉到数据源(比如在数据仓库里先算好),要么把表改成其他存储模式。前者增加了上游负担,后者牺牲了 Direct Lake 的性能优势。计算列的出现,让 DAX 表达式可以直接在语义模型层完成推导,不再需要“为了一个字段换赛道”。

能解决哪些实际问题

从典型场景看,这个功能覆盖了日常建模中相当高频的需求:

  • 派生值:比如从出生日期计算年龄,Age = DATEDIFF( DimCustomer[BirthDate], TODAY(), YEAR )
  • 字段拼接:把城市和地区拼成一个字段用于切片器,Customer Location = DimCustomer[CityName] & ", " & DimCustomer[ContinentName]
  • 格式化日期:生成“年月”格式用于视觉对象分组,Month Name = FORMAT( DimDate[FirstOfMonth], "mmmm", USERCULTURE() )
  • 多语言报表:借助 USERCULTURE() 让日期或文本随查看者语言自动切换
  • 个性化内容:通过 USERPRINCIPALNAME() 等函数,让不同登录用户看到不同的展示内容

前两个例子在无安全上下文差异时,所有用户拿到的值都一样。第三个例子则不同——它会根据报表查看者的语言环境动态调整,这在跨国企业或外企分支机构的本地化报表里非常实用。

用户上下文(User Context)是关键设计

这次新增的 Expression Context(表达式上下文) 属性,是理解 Direct Lake 计算列安全行为的核心。目前 Direct Lake 计算列只支持 User Context 模式,这意味着:

  • 表达式在用户查询模型时才被评估
  • 计算过程自动遵循行级安全性(RLS)和对象级安全性(OLS)
  • 只要表达式不引用用户感知型 DAX 函数或受安全控制的列,通常所有用户得到的结果一致

这里有一个容易被忽视但极其重要的安全细节。假设模型中有一个受 OLS 保护的列 DimCustomer[Education],你基于它写了一个计算列:

Is Graduate = IF( DimCustomer[Education] = "Graduate Degree", "Yes", "No" )

在传统的 Import 模式标准上下文下,受限用户虽然看不到原始教育字段,但依然能通过这个派生列推断出“是否研究生毕业”的结论——安全保护形同虚设。而在 User Context 下,无论是 Import 还是 Direct Lake,受限用户直接看不到这个派生列,敏感值永远不会被间接暴露。

这正是 Direct Lake 计算列与普通计算列的本质区别:它不是静态的列,而是带着用户安全上下文动态求值的表达式。

使用边界与注意事项

虽然功能很香,但有两个限制需要提前知道:

不能用于关系键。 Direct Lake 计算列在查询时评估,不会物化存储,因此无法作为表间关系的关联键。如果需要关系键,请在 Delta 表里预先构建好。

不响应筛选上下文。 计算列对每一行返回固定值,不会随报表筛选器或切片器变化。如果结果需要随用户交互动态改变,应该用度量值(Measure)而不是计算列。

这两个边界其实和传统计算列的逻辑一致,只是 Direct Lake 的“不物化”特性让第一个限制更加刚性。

上手路径

现在就可以在 Web 建模或 Power BI Desktop 中打开一个 Direct Lake on OneLake 语义模型,直接创建计算列,用 DAX 开始建模。预览阶段的功能通常意味着后续可能会有行为调整,建议在非生产环境中先验证你的核心场景。

对于国内的数据团队来说,这个功能的实际价值在于:它让“快速迭代分析模型”这件事不再受制于数据工程排期。以前加一个字段可能要等数仓团队改 ETL,现在分析师自己动手,几分钟搞定。当然,如果你的计算逻辑涉及复杂的安全控制或需要跨表引用,还是需要仔细评估 User Context 下的行为是否符合预期。

相关文章

Power BI 和 Microsoft Fabric 的 Databricks ADBC 连接器正式发布

Power BI 和 Microsoft Fabric 的 Databricks ADBC 连接器正式发布

微软正在把 Power Query 连接器的底层驱动从 ODBC 迁到 ADBC,这次轮到 Databricks。适用于 Power BI 和 Microsoft Fabric 的 Databricks ADBC 连接器已正式 GA(Generally Available,正式发布)。

#技术分享#Power BI#Fabric#语义模型
Power BI 2026 年 10 月功能摘要

Power BI 2026 年 10 月功能摘要

距离上一次九月更新才过去没多久,而且当时还赶上了欧洲 Microsoft Fabric + SQL 社区大会,更新量已经不小。

#技术分享#Power BI#Fabric#Copilot
Microsoft Data Factory 的 Amazon Redshift V2 连接器

Microsoft Data Factory 的 Amazon Redshift V2 连接器

微软正在对 Amazon Redshift 连接器进行重要升级,底层驱动将从旧版切换至全新的 Amazon Redshift ODBC 2.x。

#技术分享#Power BI#Fabric
F2容量跑通完整报表方案

F2容量跑通完整报表方案

很多团队一提到 Microsoft Fabric,第一反应就是:F2 这种小容量能干嘛? 跑个 Demo 都嫌卡,更别说承载一套完整的报表解决方案了。

#技术分享#Power BI#最佳实践
近似去重反而更慢?

近似去重反而更慢?

做 DAX 性能优化的人,看到 `APPROXIMATEDISTINCTCOUNT` 这个新函数,第一反应多半是:终于有办法治 `DISTINCTCOUNT` 这个性能杀手了。 但最近一轮实测下来,结论有点打脸——在某些场景下,近似去重反而比精确去重更慢。

#Power BI#最佳实践
近似去重计数:快但准吗?

近似去重计数:快但准吗?

9 月 Power BI 更新后,Import 模式和 Direct Lake 模式的语义模型开始支持 `ApproximateDistinctCount()` 这个 DAX 函数。 我在一个 14 亿行的 Direct Lake 语义模型上做了测试,数据来自纽约出租车样本。

#Power BI#最佳实践
有问题?加企业微信 1 对 1 交流 👇
➕ 添加企业微信
备注「白杨」优先通过 · 数据洞察与智能决策
企业微信
企业微信
备注「白杨」优先通过