白杨商业智能工作室
#Power BI#最佳实践

近似去重反而更慢?

· 白杨BI工作室

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

近似去重反而更慢?

一个反直觉的测试结果

做 DAX 性能优化的人,看到 APPROXIMATEDISTINCTCOUNT 这个新函数,第一反应多半是:终于有办法治 DISTINCTCOUNT 这个性能杀手了。

但最近一轮实测下来,结论有点打脸——在某些场景下,近似去重反而比精确去重更慢。

这不是段子,而是引擎层面的真实差异。

测试环境

用一个非常基础的 Direct Lake 语义模型,数据是纽约出租车数据集的 2017 年部分:

  • 表行数:约 1170 万行
  • 测试列:VendorID
  • 该列不同值数量:只有 2 个

建了两个度量值做对比:

  1. DISTINCTCOUNT('green_tripdata_2017'[VendorID])
  2. APPROXIMATEDISTINCTCOUNT('green_tripdata_2017'[VendorID])

冷缓存下的性能对比

对 85562 行数据做聚合,冷缓存条件下:

精确去重版本

  • 查询总耗时:188ms
  • 单次扫描 CPU 时间:110ms
  • 内存占用:约 8MB

近似去重版本

  • 耗时和资源消耗都明显更高(原文测试图显示差距不小)

也就是说,这个本该更快的函数,在低基数列上完全跑不过原版。

为什么会这样?

关键在于引擎对 DISTINCTCOUNT 有一层针对低基数列的特殊优化,而 APPROXIMATEDISTINCTCOUNT 走的近似算法路径没法复用这套优化。

具体来说:

  • 当列的不同值很少时,精确去重可以走位图 / 哈希等紧凑结构,扫描成本极低
  • 近似算法为了保证精度,需要维护额外的统计结构(如 HLL 的寄存器),反而带来固定开销
  • 基数越低,这个固定开销相对于精确计算越不划算

什么时候该用哪个?

结合上次那篇讲 APPROXIMATEDISTINCTCOUNT 优势的文章,可以总结出一条实用判断规则:

  • 高基数列(几十万、上百万不同值):用 APPROXIMATEDISTINCTCOUNT,收益明显
  • 低基数列(几十、几百个不同值):老老实实用 DISTINCTCOUNT,别折腾
  • 对精度有硬要求:无论基数高低,都用 DISTINCTCOUNT

给国内 BI 同行的一句话

新函数不等于万能药。做性能优化时,先测再换,别被函数名里的 "Approximate" 和 "优化" 字眼带偏。低基数列上,原版 DISTINCTCOUNT 依然是更稳的选择。

相关文章

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#最佳实践
近似去重计数:快但准吗?

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

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

#Power BI#最佳实践
微软与 Snowflake 共同致力于 Apache Ossie

微软与 Snowflake 共同致力于 Apache Ossie

语义层正在成为 AI 驱动分析的关键基础设施,但一个老问题始终困扰着数据团队:同一套业务指标定义,往往要在不同平台之间反复重建。微软与 Snowflake 近期联合宣布对 Apache Ossie(孵化中)项目的承诺,正是冲着这个痛点去的。

#技术分享#Power BI#Fabric#语义模型
有问题?加企业微信 1 对 1 交流 👇
➕ 添加企业微信
备注「白杨」优先通过 · 数据洞察与智能决策
企业微信
企业微信
备注「白杨」优先通过