mcpField
P
performance-optimization

performance-optimization

github.com/josiahsiegel数据与数据库5992 次安装19 周前更新
代码仓库

关于 performance-optimization

面向 Power BI 开发者的性能优化技能,涵盖模型、DAX 与报表视觉对象的诊断和改进,并介绍 Performance Analyzer 与 DAX Studio 的分析流程。

主要功能

  1. 01使用 Performance Analyzer 定位耗时视觉对象
  2. 02通过 DAX Studio 分析查询计划与引擎耗时
  3. 03检查 VertiPaq 模型大小和压缩
  4. 04优化数据模型、关系与分区
  5. 05改进 DAX 表达式和报表视觉配置

适用场景

  1. 01排查报表页面响应缓慢的原因
  2. 02减少语义模型的内存占用
  3. 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 所需的时间优化度量值,检查筛选器上下文
视觉对象显示呈现结果所需的时间减少数据点,简化视觉对象
其他杂项开销通常影响较小,除非占主导地位,否则可忽略

工作流:

  1. 开始录制
  2. 清除视觉对象缓存(点击“刷新视觉对象”)
  3. 与报表交互(更改切片器、切换页面)
  4. 从运行缓慢的视觉对象中复制 DAX 查询
  5. 粘贴到 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 工作流:

  1. 连接到 Power BI Desktop(或 XMLA 终结点)
  2. 启用 Server Timings(Query > Server Timings)
  3. 粘贴从性能分析器复制的 DAX 查询
  4. 执行并分析耗时分解
  5. 留意以下情况:
    • 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、聚合
切片器过多每次更改切片器都会重新查询所有可视化对象使用“应用”按钮
减少查询

启用查询减少功能:

  1. 报表设置 > 查询减少 > 向切片器添加“应用”按钮——用户完成所有切片器更改后点击“应用”
  2. 减少发送的查询数量 > 默认禁用交叉突出显示——减少可视化对象之间的查询
条件格式

避免在大型表上使用基于复杂 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 最新功能

评论

支持 Markdown