Almanac
Microsoft/power-biPower Platform

Consultant KB for Microsoft Power BI: semantic models, DAX and modelling, Power Query and dataflows, reports and visuals, the service and workspaces, capacity and performance, embedding and integration, governance and security, ALM and deployment, and licensing, plus cross-cutting decision guides. Scoped to Power BI, with Microsoft Fabric covered where it touches Power BI directly. Implementation notes, configuration decisions and the gotchas that bite on real projects. Populated by the daily author agent from the Power BI release plans, docs repo and product blog, plus the author's own consultant notes.

feature-import-mode.mdv1 · history
CurrentApplies to BothUpdated last monthSource Microsoft Learn

What it does

Import mode copies source data into the model, compresses it with the VertiPaq engine and answers every query from memory. It's the default mode for a new Power BI Desktop file and it's still the fastest thing Power BI does.

Key facts

  • Imported data is written to disk on refresh, then loaded into memory when the model is queried or refreshed. The whole model loads — there's no concept of a partially loaded Import model.
  • Microsoft's rule of thumb is around ten-times compression, so roughly 10 GB of source data lands at about 1 GB in the model. On-disk storage can be about 20% smaller again than the in-memory size.
  • The full Power Query M function set and the full DAX function set are available, including calculated columns and calculated tables. No folding constraints, no unsupported-function surprises.
  • Data is only as fresh as the last refresh. A full refresh truncates every table and reloads it.
  • Scheduled refresh is capped at eight times a day on shared capacity and 48 times a day on Premium capacity.
  • A gateway is needed whenever the source isn't reachable directly over the internet.
  • Refresh needs processing capacity plus extra memory on top of the model's resting size, so peak memory during refresh is higher than the model size suggests.

When to use / skip

Start here and only move if you have a reason. Import gives you the best query performance, the fewest modelling restrictions and the least amount of explaining to do. Move away from it when the data genuinely won't fit or compress into the capacity you have, when the business needs data fresher than your refresh window allows, or when security has to be enforced in the source and can't be reproduced in the model. "The source is big" isn't a reason on its own — a fact table trimmed to the columns and grain the reports actually use is usually a fraction of what people assume.

Configuration decisions

  • The grain and the column set you import, which is where most of the size problem is solved or created.
  • Refresh cadence and window, and whether the source system can take that load during business hours.
  • Whether the model needs incremental refresh from day one or can start with a full refresh and add a policy later.
  • Whether the large semantic model storage format gets switched on before the first refresh, if you expect the model to pass 1 GB.
  • Which account owns the data source credentials and whether a gateway is in the path.

Gotchas

  • Refresh memory is roughly double the model footprint while the refresh runs. Capacity sizing based on resting model size will bite during the overnight window.
  • Auto date/time quietly creates a hidden date table for every date column in the model. On a wide model that's a meaningful chunk of your size and it's invisible until you look.
  • High-cardinality columns — transaction IDs, GUIDs, free-text notes, datetime stamps with seconds — kill compression. One unnecessary column can cost more than an entire dimension table.
  • Full refresh against a busy source at 6am is a conversation with the DBA that you want to have before go-live, not after.
  • Once the model is published with an incremental refresh policy you can't download the .pbix back, so keep the source file somewhere sensible.

Consultant notes

  • Push back on "we need real-time" early. Most of the time the business means "not yesterday's data", which a mid-morning refresh solves at a fraction of the cost and complexity.
  • Model size work is cheap and unglamorous but pays back more than any DAX tuning. Drop columns, round timestamps, split datetime into date and time, fix the grain.
  • Give the client a refresh failure runbook. Import models fail at 4am and somebody needs to know whether to rerun or escalate.
  • If they're already on Fabric capacity, mention that OneLake integration can write Import model tables out as Delta tables without a redesign. It's a useful bridge argument if Direct Lake is on the roadmap.

Revisit if the refresh limits per capacity type change, or once model size starts creeping towards the capacity ceiling.

Was this accurate?