Import
Import loads a compressed copy of the data into VertiPaq. It's the default and almost always the fastest — queries never leave Power BI.
Costs: data is only as fresh as the last refresh, and the model is subject to size limits (1 GB compressed per dataset on Pro; much larger on Premium/Fabric capacity).
DirectQuery
DirectQuery leaves data in the source and issues a query per visual interaction. Data is always current and there's no size ceiling.
Costs are real: every slicer click is a round trip, so performance depends entirely on the source. Many DAX functions are unavailable or slow, calculated columns are limited, and some Power Query transformations can't fold into the source query and are therefore blocked.
Use it when data must be real-time, or when the volume genuinely can't be imported.
Composite models and dual mode
A composite model mixes both — large fact tables in DirectQuery, small dimensions in Import.
That combination creates a problem: a slicer built on an Import dimension would need a DirectQuery join anyway. Dual storage mode solves it. A dual table is stored both ways, and the engine picks per query — served from memory when the query is Import-only, queried at source when it must join to a DirectQuery fact.
The standard pattern is: fact tables DirectQuery, dimension tables Dual.
Live connection
A live connection to an Analysis Services model or a published Power BI dataset is different again. You're not building a model at all — you're reporting on someone else's. No Power Query, no relationships, no calculated columns; you can add report-level measures only.
This is the right choice for enterprise setups where a central team owns the model.