$npx -y skills add PatrickGallucci/fabric-skills --skill fabric-pbi-perf-remediateDiagnose and resolve Power BI performance issues in Microsoft Fabric. Use when reports load slowly, DAX queries are inefficient, semantic models need optimization, DirectQuery is underperforming, capacity is throttled, visuals render slowly, or data refresh is slow. Covers Perfor
| 1 | # Power BI Performance remediate in Microsoft Fabric |
| 2 | |
| 3 | Systematic toolkit for diagnosing, analyzing, and resolving Power BI performance bottlenecks across the Microsoft Fabric platform. Covers semantic model optimization, DAX tuning, capacity management, DirectQuery diagnostics, and report design best practices. |
| 4 | |
| 5 | ## When to Use This Skill |
| 6 | |
| 7 | - Power BI reports are slow to load or interact with |
| 8 | - DAX queries take too long to execute |
| 9 | - Semantic model refresh is slow or timing out |
| 10 | - Fabric capacity is throttled or overutilized |
| 11 | - DirectQuery reports have high latency |
| 12 | - Visuals render slowly or time out |
| 13 | - Users report intermittent performance degradation |
| 14 | - Migrating to Fabric and need to optimize for the new platform |
| 15 | - Planning capacity sizing for Power BI workloads |
| 16 | - Conducting a performance audit or health check |
| 17 | |
| 18 | ## Prerequisites |
| 19 | |
| 20 | | Tool | Purpose | Required | |
| 21 | | --------------------------------------- | ----------------------------------------- | ------------ | |
| 22 | | Power BI Desktop | Performance Analyzer, DAX query view | Yes | |
| 23 | | DAX Studio | Advanced DAX profiling and server timers | Recommended | |
| 24 | | Fabric Capacity Metrics App | Capacity utilization monitoring | Yes (admins) | |
| 25 | | Tabular Editor / Best Practice Analyzer | Semantic model analysis | Recommended | |
| 26 | | SQL Server Profiler | DirectQuery trace analysis | Optional | |
| 27 | | PowerShell 7+ | Automation scripts included in this skill | Optional | |
| 28 | |
| 29 | ## Step-by-Step Workflows |
| 30 | |
| 31 | ### Workflow 1: Initial Performance Triage |
| 32 | |
| 33 | Determine where the bottleneck lives before diving deep. |
| 34 | |
| 35 | 1. **Reproduce the issue** in Power BI Desktop with Performance Analyzer enabled |
| 36 | - View ribbon > Performance Analyzer > Start recording > Refresh visuals |
| 37 | 2. **Categorize each visual** by its dominant cost: |
| 38 | - DAX query duration > 500ms → Investigate semantic model / DAX |
| 39 | - Visual display duration > 500ms → Investigate report design |
| 40 | - Other duration > 500ms → Investigate data source / gateway |
| 41 | 3. **Check capacity health** using the Fabric Capacity Metrics app |
| 42 | - Look for overload (>100% utilization), throttling events, or queued operations |
| 43 | 4. **Route to the appropriate deep-dive workflow below** |
| 44 | |
| 45 | ### Workflow 2: DAX Query Optimization |
| 46 | |
| 47 | See [dax-optimization-patterns.md](./references/dax-optimization-patterns.md) for a comprehensive catalog of anti-patterns and fixes. |
| 48 | |
| 49 | 1. Capture slow DAX from Performance Analyzer (copy query from visual) |
| 50 | 2. Open DAX query view in Power BI Desktop (or DAX Studio) |
| 51 | 3. Run query with Server Timings enabled (DAX Studio: Server Timings tab) |
| 52 | 4. Analyze the breakdown: |
| 53 | - **Formula Engine (FE) time**: DAX calculation overhead |
| 54 | - **Storage Engine (SE) time**: Data scan / retrieval overhead |
| 55 | - **SE queries count**: High count indicates poor query plan |
| 56 | 5. Apply optimization patterns from the reference guide |
| 57 | 6. Re-test and compare timings |
| 58 | |
| 59 | ### Workflow 3: Semantic Model Optimization |
| 60 | |
| 61 | See [capacity-optimization.md](./references/capacity-optimization.md) for Fabric-specific tuning. |
| 62 | |
| 63 | 1. Run Best Practice Analyzer (Tabular Editor or Fabric notebook) |
| 64 | 2. Address findings by priority: |
| 65 | - Remove unused columns and tables |
| 66 | - Fix incorrect data types (text dates, high-precision decimals) |
| 67 | - Replace calculated columns with calculated measures where possible |
| 68 | - Reduce cardinality on high-cardinality columns |
| 69 | 3. Evaluate storage mode (Import vs DirectQuery vs Composite) |
| 70 | 4. Configure incremental refresh for large fact tables |
| 71 | 5. Enable VOrder for read-heavy Power BI workloads in Fabric: |
| 72 | ``` |
| 73 | spark.sql.parquet.vorder.default=true |
| 74 | ``` |
| 75 | |
| 76 | Or use the `readHeavyForPBI` resource profile at the environment level. |
| 77 | |
| 78 | ### Workflow 4: Report Design Optimization |
| 79 | |
| 80 | 1. Audit visual count per page (target: 8 or fewer interactive visuals) |
| 81 | 2. Identify high-cardinality visuals (tables/matrices with thousands of rows) |
| 82 | 3. Check for excessive cross-filtering between visuals |
| 83 | 4. Evaluate filter context complexity (many slicers, complex RLS) |
| 84 | 5. Consider: |
| 85 | - Bookmarks + drill-through instead of dense pages |
| 86 | - Pre-aggregated measures instead of visual-level calculations |
| 87 | - Paginated reports for large tabular exports |
| 88 | |
| 89 | ### Workflow 5: DirectQuery Performance |
| 90 | |
| 91 | See [directquery-tuning.m |