Power BI has 3 storage modes for tables: Import, DirectQuery, and Dual . These can be combined in a Composite Model where different tables use different storage modes.
Whether you're dealing with a small departmental report or a massive enterprise data warehouse, understanding the nuances between Import, DirectQuery, and Dual modesβand how to combine them in Composite Modelsβis essential. Let's dive into the details that will transform how you architect your Power BI solutions.
Quick Comparison
| Feature | Import | DirectQuery | Dual |
|---|---|---|---|
| Data Location | In-memory (cached) | Source database | Import + DirectQuery |
| Performance | Excellent | Variable | Good |
| Data Freshness | Scheduled | Real-time | Mixed |
| Dataset Size | Limited by memory | Unlimited | Limited by memory |
| DAX Support | Full | Limited | Full |
Storage Modes Explained
| Category |
Import
DEFAULT
|
DirectQuery
REAL-TIME
|
Dual
HYBRID
|
|---|---|---|---|
| Description | Data loaded and compressed into Power BI's in-memory engine (VertiPaq). Most common and fastest mode. | Queries sent directly to source database in real-time. No data stored in Power BI. | Tables act as either Import or DirectQuery depending on context. Power BI auto-selects best option. |
| Benefits | |||
| Performance | β‘ Blazing fast - all queries from memory | Variable - depends on database | β‘ Fast when cached |
| Data Freshness | Scheduled refreshes only | β (Near) Real-time, always current | β Mixed (fresh + cached) |
| Dataset Size | Limited by memory (1-10 GB typical) | β Unlimited - stays at source | Limited for cached tables |
| DAX Support | β Full functionality | β Limited functions | β Full functionality |
| Compression | β Excellent (10:1 typical) | N/A - no storage | β For cached tables |
| Offline Access | β Works without connection | β Requires connectivity | Partial |
| Data Source Support | β All PBI sources (databases, files, feeds, web, dataflows, etc.) | β Only major relational databases, PBI datasets, Analysis Services | β Same as Import |
| Power Query (M) Support | β All transformations | β Limited - must translate to native SQL | β All transformations |
| Bottlenecks & Limitations | |||
| Data Staleness | β Requires scheduled refreshes | β Always fresh | Mixed |
| Memory Limits | β Large datasets need Premium | β No limits | β For cached data |
| Query Speed | β Sub-second responses | β Each query hits database | Variable |
| Database Load | β No impact after refresh | β Can overwhelm source | β For DirectQuery tables |
| Complexity | β Simple to understand | Moderate | β Harder to predict |
| Refresh Time | β Can take hours for large data | β No refresh needed | For Import tables |
| Source System Impact | β Impact only during refresh | β Every user query hits source (OLTP impact risk) | β For DirectQuery queries |
| Row-Level Security | Defined in Power BI model | β Can leverage source database RLS (some sources) | Defined in Power BI model |
| When to Use | |||
| Ideal For |
β’ Dataset under 1-10 GB β’ Need fastest performance β’ Real-time not critical β’ Complex DAX needed β’ Standard reporting |
β’ Near real-time data critical β’ Extremely large datasets (TB) β’ Optimized database β’ Compliance requirements β’ Can't fit in memory |
β’ Using Composite models β’ Small dimension tables β’ Optimize DirectQuery β’ Span Import/DirectQuery β’ Mixed relationships |
| Example Scenario | |||
| Real-World Use | Sales Dashboard: 500 MB monthly sales data, nightly refresh. Fast interactive reports with complex year-over-year calculations. 24-hour-old data acceptable. | Live Inventory: 50 TB warehouse data in Azure SQL. Real-time stock levels. Database has optimized indexes and aggregation tables. | Composite Sales Model: Product/Customer dimensions in Dual (small, stable). Sales fact table in DirectQuery (large, real-time). Power BI uses cached dims when possible. |
π― Final Thoughts
The best storage mode isn't the one with the most features or the newest technologyβit's the one that meets your specific business requirements while delivering the performance your users expect. Start simple with Import, optimize ruthlessly, and only add complexity when it solves a real problem.