Skip to content

Chapter 6 of 6

Performance, Storage Modes, and Security

Power BI offers several storage modes that determine how tables are queried. Import mode loads data into the in-memory VertiPaq engine, providing the fastest performance and full DAX support, with data refreshes scheduled separately. DirectQuery leaves data in the source and sends live queries for every visual interaction, ensuring freshness but depending on source performance. Dual mode allows the engine to choose between Import and DirectQuery per query, while Live connections link Power BI to existing Analysis Services or Power BI datasets without allowing model modification. Composite models combine these modes, typically caching smaller dimension tables in Import while querying large fact tables via DirectQuery. Aggregations accelerate DirectQuery performance by routing detail-level queries to pre-summarized Import-mode tables, dramatically reducing response times for billion-row fact tables.

Performance optimization depends on understanding the VertiPaq storage engine and the formula engine. VertiPaq stores data in compressed columnar format using dictionary encoding, so high-cardinality columns consume more memory and slow compression. The formula engine handles complex DAX logic single-threaded, while the storage engine handles simple aggregations in parallel. Best practices include using a star schema, preferring measures over calculated columns, limiting columns and rows imported, setting proper data types, disabling auto-date tables, and reducing high-cardinality visuals. Calculated columns increase model size because they are materialized, so heavy use can slow refresh times. Tools like DAX Studio, Performance Analyzer, and Tabular Editor help diagnose slow measures and inspect query plans.

Row-level security (RLS) restricts data access based on user identity. Roles are defined in Power BI Desktop via the Manage Roles dialog using DAX filter expressions, and users or groups are assigned to those roles in the Power BI Service. Functions such as USERNAME and USERPRINCIPALNAME return the current user's identity and are typically embedded inside RLS filters to dynamically scope data visibility. Other advanced features include bookmarks for capturing report state, drillthrough pages for filtered detail navigation, slicer synchronization across pages, tooltip pages for rich hover details, the Decomposition Tree visual for AI-driven root-cause analysis, and What-If parameters built on GENERATESERIES for scenario modeling. Together, these features support performant, secure, and interactive Power BI solutions.

All chapters
  1. 1Foundations of DAX and Calculation Types
  2. 2CALCULATE and Filter Manipulation
  3. 3Iterator, Aggregation, and Lookup Functions
  4. 4Time Intelligence and Date Tables
  5. 5Data Modeling, Relationships, and Schemas
  6. 6Performance, Storage Modes, and Security

Drill it

Reading is not remembering. These come from the Power Bi Dax Fundamentals deck:

Q

What is a DAX measure?

A calculated formula created using DAX that is evaluated at query time based on filter context. Measures return dynamic values depending on the filters applied...

Q

How does filter context work in DAX?

Filter context is the set of filters applied to a calculation, generated by slicers, visuals, page-level filters, or row-level security. It determines which row...

Q

What does the CALCULATE function do?

CALCULATE evaluates an expression in a modified filter context. It can add, replace, or remove filters on specified columns, overriding the existing filter cont...

Q

What is the syntax for CALCULATE?

CALCULATE(, , , ...). The expression is evaluated after applying all listed filter arguments, which can be boolean expressions, table expressions, or KEEPFILTER...