Find and remove unused measures and columns
Safely remove every column and measure that no visual, report, or downstream model references — to shrink your semantic model, speed up refreshes, free up RAM, and lower your capacity bill.
Last updated · May 22, 2026
Run a scan first. “Unused” is something Measure Killer’s Where-used scan tells you. If you haven’t run one yet, start with the desktop walkthrough at Run your first scan or the online one at Run your first online scan — the rest of this doc assumes you’re already looking at a finished Where-used table.
Why clean up matters
Every unused column and measure in a semantic model has a cost. The metadata is loaded into memory, included in refreshes, indexed by AI features, and counted toward your capacity — even when nothing actually queries it. Cleaning out the dead weight pays off in several ways:
- Faster refreshes. Less metadata and fewer columns in scope means less work per refresh cycle.
- Smaller in-memory footprint. Power BI’s VertiPaq engine loads the entire model into RAM. Dropping unused columns can shrink the footprint by 30–80% on a typical untended model — Power BI Desktop stops thrashing the local machine, and the model fits comfortably in a smaller Fabric SKU.
- Lower capacity bill. If your model size is what’s forcing you to pay for an F32 or F64, trimming it down can let you step down a tier — directly saving money every month.
- Better Copilot / AI features. AI tooling indexes everything in the model. Unused tables and measures muddy lineage and surface as irrelevant suggestions.
- General performance. Smaller model = faster page loads, snappier visuals, less wire traffic.
What counts as “unused”
Measure Killer’s definition is operational: if removing it would break a report or change any visible output — even a subtle effect like a conditional-formatting rule that turns a cell background a different color — it counts as used. If nothing in the analyzed scope depends on it that way, it’s unused.
Concretely, a column or measure is flagged as unused when nothing in scope references it via any of:
- A visual or filter on any page of any connected report — including references that only power conditional formatting, tooltips, drill-through, or dynamic titles
- Another measure, calculated column or calculated table
- A row-level security rule, or a field parameter
- A calculation group or calculation item
- A connected Excel file (online scan only)
- A downstream semantic model or a report on a downstream model (online scan only)
The bigger the scope you analyzed, the more confident you can be that
an “unused” row really is unused. A desktop scan only knows about the
current .pbix; an online scan knows about every report and
downstream model in the tenant.
TODO: explain edge cases — measures referenced only via dynamic M, calculation groups whose calculation items are referenced via DAX
SELECTEDVALUEagainst a string, columns referenced only via field parameters with conditional logic, etc.
Removal methods
Measure Killer gives you a few different ways to actually remove the unused items, depending on edition, where the model lives, and how aggressive you want to be.
Bulk export from “Clean your model” (paid)
The fastest path. On the Clean your model tab (paid edition), the top suggestion is Remove unused artifacts. Right-click it and use Export clean TMDL to write a TMDL definition of the model with every unused column and measure stripped out. Then apply the TMDL via Tabular Editor (or push it directly to the model in the Service).
This is the recommended path for medium-to-large models — one action, all the unused items in one go, deterministic and reviewable.
TODO: screenshot of the “Remove unused artifacts” row with the “Export clean TMDL” action highlighted.
”Clean TMDL” button (paid)
TODO: walk through the dedicated Clean TMDL button — what it does, how it differs from the per-suggestion “Export clean TMDL” action above, where the file lands, how to apply it back to the model.
Manual removal in Power BI Desktop (free)
The free edition surfaces what’s unused but doesn’t write any changes for you. Workflow:
- Sort the Where-used table by # of use ascending so the rows with 0 references float to the top.
- For each unused row, switch to Power BI Desktop and right-click → Delete the column or measure.
- Save the file. Re-run Analyze in Measure Killer to refresh the view and confirm nothing else broke.
Slower than the paid options, but works for any edition against any
local .pbix.
Online removal via XMLA (paid)
For models already published to the Service, Measure Killer can write
the cleanup back to the live model via the XMLA endpoint — no .pbix
download, no TMDL hop. See Kill via XMLA (online removal)
for the full walkthrough.
Delete safely
Rules of thumb before you bulk-delete anything:
- Check the scope. A “0 references” measure in a desktop scan only
means no visual in this
.pbixuses it. If the model is shared, re-scan online to confirm no other report or downstream model does. - Watch for dynamic references. Measures resolved via dynamic M
parameters, calculation groups, or DAX
SELECTEDVALUEagainst a string can appear unused when they aren’t. Spot-check anything that looks suspicious. - Talk to downstream owners. If the online lineage shows reports in workspaces you don’t own, give those owners a heads-up before you remove anything they might (re)introduce a dependency on.
- Keep a backup. Export the original
.pbix, or run a Measure Killer TMDL backup, before destructive changes.
What changes after cleanup
Re-run a scan to confirm the change took effect. If the model is in the Service, expect the next scheduled refresh to be measurably faster and the in-memory size to drop in the workspace settings.
Related
- Run your first scan — the desktop walkthrough that produces this view
- Run your first online scan — the online walkthrough for shared semantic models
- Kill via XMLA (online removal) — remove measures and columns from a model published to the Service
- Best-practice analysis (reports + models) — the broader set of cleanup recommendations