关于 performance-optimization
面向 Power BI 开发者的性能优化技能,涵盖模型、DAX 与报表视觉对象的诊断和改进,并介绍 Performance Analyzer 与 DAX Studio 的分析流程。
主要功能
- 01使用 Performance Analyzer 定位耗时视觉对象
- 02通过 DAX Studio 分析查询计划与引擎耗时
- 03检查 VertiPaq 模型大小和压缩
- 04优化数据模型、关系与分区
- 05改进 DAX 表达式和报表视觉配置
适用场景
- 01排查报表页面响应缓慢的原因
- 02减少语义模型的内存占用
- 03优化复杂或高耗时的 DAX 度量值
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ josiahsiegel/ claude-plugin-marketplace --skill performance-optimization安装后在 Claude Code 中输入/performance-optimization确认已加载。
附带文件references/advanced-capacity-patterns.mdreferences/dax-studio-walkthrough.md
详细介绍
性能优化
概述
Power BI 的性能取决于数据模型设计、DAX 效率、视觉对象配置和基础设施。本技能涵盖诊断工具、优化技巧和最佳实践,帮助创建快速、响应灵敏的报表。
诊断工具
性能分析器(内置)
在 Power BI Desktop 中启用:视图 > 性能分析器 > 开始录制
| 指标 | 含义 | 变慢时的处理方法 |
|---|---|---|
| DAX 查询 | 执行 DAX 所需的时间 | 优化度量值,检查筛选器上下文 |
| 视觉对象显示 | 呈现结果所需的时间 | 减少数据点,简化视觉对象 |
| 其他 | 杂项开销 | 通常影响较小,除非占主导地位,否则可忽略 |
工作流:
- 开始录制
- 清除视觉对象缓存(点击“刷新视觉对象”)
- 与报表交互(更改切片器、切换页面)
- 从运行缓慢的视觉对象中复制 DAX 查询
- 粘贴到 DAX Studio 中进行深入分析
DAX Studio
用于深入分析 DAX 性能的免费外部工具:
主要功能:
- 执行 DAX 查询并计时
- Server Timings:显示存储引擎(SE)与公式引擎(FE)的耗时
- Query Plan:查看逻辑和物理查询计划
- VertiPaq Analyzer:分析模型大小和压缩情况
- All Queries 跟踪:捕获报表发送的所有查询
Server Timings 分解:
| 引擎 | 功能 | 优化目标 |
|---|---|---|
| 存储引擎(SE) | 扫描 VertiPaq 数据并检索行 | 降低基数,减少扫描的列 |
| 公式引擎(FE) | 计算 DAX 公式 | 简化 DAX,避免嵌套迭代器 |
**理想比例:**SE 应占总耗时的 80%–90%。FE 占比过高意味着 DAX 执行了过多计算。
常见的 DAX Studio 工作流:
- 连接到 Power BI Desktop(或 XMLA 终结点)
- 启用 Server Timings(Query > Server Timings)
- 粘贴从性能分析器复制的 DAX 查询
- 执行并分析耗时分解
- 留意以下情况:
- SE 查询数量过多(表明存在物化问题)
- SE 查询中出现 CallbackDataID(数据被发送到 FE 进行处理——应避免)
- FE 耗时过长(DAX 过于复杂)
- SE 行数过多(扫描的数据过多)
VertiPaq Analyzer
在 DAX Studio 中分析模型大小和压缩情况:Advanced > View Metrics
| 指标 | 检查内容 | 目标 |
|---|---|---|
| 表大小(字节) | 找出最大的表 | 减少列数,移除未使用的列 |
| 列基数 | 高基数 = 压缩效果差 | 减少不同值的数量,将罕见值分组 |
| 列大小 | 占用空间明显偏大的列 | 移除或移至维度表 |
| 字典大小 | 较大的字符串字典 | 缩短字符串,使用键 |
| 关系大小 | 关系映射占用的内存 | 属于正常开销,无法直接优化 |
| 层次结构大小 | 隐藏的自动日期/时间层次结构 | 禁用自动日期/时间 |
数据模型优化
列优化
| 技巧 | 影响 | 方法 |
|---|---|---|
| 移除未使用的列 | 高 | 删除未用于任何视觉对象、度量值或关系的列 |
| 降低列基数 | 高 | 将罕见值分组(将最低的 5% 归入“其他”) |
| 使用整数键 | 高 | 将文本外键替换为整数代理键 |
| 拆分日期/时间 | 中 | 将 DateTime 拆分为 Date(日期)和 Time(时间)列 |
| 对小数进行舍入 | 中 | 舍入到小数点后 2 位,而不是 15 位 |
| 避免计算列 | 中 | 改用度量值(查询时计算,而非存储) |
| 禁用自动日期/时间 | 中 | Options > Data Load > 取消勾选 |
| 从事实表中移除文本 | 高 | 将描述移至维度表 |
关系优化
- 使用单向交叉筛选(避免双向筛选)
- 对 DirectQuery 关系启用“Assume Referential Integrity”
- 移除未使用或冗余的关系
- 在关系中使用整数键列
分区策略
对于大型表,按日期范围进行分区:
- 历史分区(按年/季度)——很少刷新
- 最近分区(当前月/周)——频繁刷新
- 使用增量刷新自动管理分区
DAX 优化
高影响模式
使用变量避免重复计算:
// BAD: Calculates [Total Sales] three times
Margin % = DIVIDE([Total Sales] - [Total Cost], [Total Sales])
// GOOD: Single calculation, reuse via variable
Margin % =
VAR Sales = [Total Sales]
VAR Cost = [Total Cost]
RETURN DIVIDE(Sales - Cost, Sales)
避免在 CALCULATE 中对大型表使用 FILTER:
// BAD: Scans entire table
CALCULATE([Sales], FILTER(ALL(Products), Products[Category] = "Electronics"))
// GOOD: Column filter (optimized)
CALCULATE([Sales], Products[Category] = "Electronics")
避免嵌套迭代器:
// BAD: O(n^2) complexity
SUMX(Products,
SUMX(FILTER(Sales, Sales[ProductID] = Products[ProductID]),
Sales[Amount]))
// GOOD: Use relationship + simple aggregation
SUMX(Products, [Total Sales])
使用 DISTINCTCOUNT,而不是 COUNTROWS(DISTINCT(...)):
// BAD
COUNTROWS(DISTINCT(Sales[CustomerID]))
// GOOD
DISTINCTCOUNT(Sales[CustomerID])
避免在度量值中使用 FORMAT()(会返回文本并破坏排序):
// BAD: Returns text, cannot sort
MonthLabel = FORMAT([Date], "MMMM yyyy")
// GOOD: Use a pre-computed column in the Date table for display
// And a numeric sort column for ordering
度量值复杂度指南
| 复杂度 | 适用范围 | 性能影响 |
|---|---|---|
| 简单聚合(SUM、COUNT) | 任何可视化对象 | 无 |
| 带列筛选器的 CALCULATE | 任何可视化对象 | 无 |
| 单个迭代器(SUMX) | 大多数可视化对象 | 注意行数 |
| 带 FILTER(table) 的 CALCULATE | 有限的可视化对象 | 是,表较大时 |
| 嵌套迭代器 | 避免使用 | 是,始终如此 |
| SUMX 中的 CALCULATE | 谨慎使用 | 上下文转换开销 |
可视化对象优化
减少可视化对象数量
| 问题 | 影响 | 解决方法 |
|---|---|---|
| 一个页面上有 20 个以上的可视化对象 | 每个可视化对象都会发送 DAX 查询 | 每页控制在 8-12 个可视化对象 |
| 包含大量数据点的可视化对象 | 结果集较大 | 使用 Top N、聚合 |
| 切片器过多 | 每次更改切片器都会重新查询所有可视化对象 | 使用“应用”按钮 |
减少查询
启用查询减少功能:
- 报表设置 > 查询减少 > 向切片器添加“应用”按钮——用户完成所有切片器更改后点击“应用”
- 减少发送的查询数量 > 默认禁用交叉突出显示——减少可视化对象之间的查询
条件格式
避免在大型表上使用基于复杂 DAX 的条件格式。使用简单的列引用或计算量有限的度量值。
高级容量和模型模式
有关聚合、复合模型、Direct Lake 性能、大型数据集优化(10GB 以上的语义模型)、Power BI Desktop 性能设置、Power BI Report Server 调优以及书签/筛选器优化的详细指南,请参阅 references/advanced-capacity-patterns.md。调整超出基本 DAX/模型/可视化对象改进范围的企业级模型时,请加载此参考文档。
性能检查清单
数据模型
- 星型架构设计(事实表 + 维度表)
- 已禁用自动日期/时间
- 没有未使用的列
- 关系使用整数键
- 单向交叉筛选
- 文本列仅位于维度表中
- 尽可能将计算列转换为度量值
- 已处理高基数列
DAX
- 对重复表达式使用变量
- CALCULATE 中没有针对大型表的 FILTER
- 没有嵌套迭代器
- 优先使用 DISTINCTCOUNT,而不是 COUNTROWS(DISTINCT(...))
- 用于排序的度量值中没有 FORMAT
- 度量值返回数值类型(而非文本)
可视化对象
- 每页最多 8-12 个可视化对象
- 切片器上有“应用”按钮
- 对大型表应用 Top N
- 对负载较高的页面尽量减少交叉突出显示
- 条件格式使用简单表达式
基础设施
- 容量大小适合工作负载
- 大型模型(大于 1GB)使用 Premium/Fabric
- 网关已优化(内存充足、使用 SSD、靠近数据源)
- 对大型表使用增量刷新
- 对 DirectQuery 的重型查询使用聚合
Direct Lake(如适用)
- 在 delta 表写入时启用 V-Order
- 按适当频率安排帧处理
- 文件/行组数量在容量限制范围内
- 已配置并监控回退行为
- 已测试计算列对回退的影响
报表服务(如适用)
- 报表服务数据库与 PBIRS 进程隔离
- CPU 核心数足以应对并发用户峰值
- 数据库使用具备高 IOPS 的 SSD 存储
- 已为常用报表配置缓存
- 并发用户数超过 50 时,使用 NLB 进行横向扩展
其他资源
参考文件
references/dax-studio-walkthrough.md-- DAX Studio 分析分步指南,包含查询计划解读和 DAX Studio 最新功能