Unused Tables
Flags tables whose name does not appear anywhere in the analyzed report's layout — that is, tables that are not bound to any visual, query, or filter on any page of the report.
What It Detects
Soterre PBI Analyzer parses a single uploaded .pbix/.pbit file. For every table in the model it checks whether the table name appears anywhere in the report's Report/Layout JSON — the visual configurations, the visual queries, and the filters. If the name is not found, the table is flagged Unused.
Matching is a case-insensitive text search against the stringified layout. A table counts as "used" when its name shows up as an Entity / Table / Source value (optionally with an Alias. prefix), as a TableName[ DAX-style prefix, or as a directly quoted "TableName" reference.
The analyzer does not perform any model-side reachability analysis. It does not inspect:
- DAX measure expressions
- Relationships (active or inactive)
- Calculated columns or calculated-table expressions
CALCULATETABLE,FILTER, or other row-context functions
Usage is determined purely from whether the table name is referenced in the report layout.
WARNING
"Unused" here means the table's name does not appear in this report's layout — not that the table is unreferenced in the semantic model. Because the analyzer does not read DAX, relationships, or calculated-table logic, a table that feeds a measure or a relationship (but is never placed on a visual, slicer, or filter) will still be flagged. The analyzer also sees only the report contained in the uploaded file: a table shown in a different report built on the same model will still appear unused here. Always confirm in Power BI Desktop before deleting anything.
Why It Matters
- Wasted memory — Every table loaded into the VertiPaq engine occupies RAM, even if no report ever queries it. Removing genuinely unused tables frees capacity for active workloads.
- Slower refresh — Unused tables are still refreshed on schedule, consuming CUs and extending the refresh window unnecessarily.
- Model clutter — Extra tables increase cognitive load for developers browsing the model and make impact analysis harder.
- Larger model size — Bloated models hit capacity size limits sooner.
Trigger Conditions
A table is flagged Unused when:
- Its name is not found anywhere in the report layout — it is not referenced by any visual, query, slicer, or filter on any page of the report.
Threshold: A single missing reference (the name never appears in the layout) is enough to flag the table. There is no per-column or model-side analysis.
Auto date/time and automatic-hidden helper tables are the one exception: their Unused flag is deliberately suppressed even when their name is absent from the layout (see Notes and Edge Cases).
Output
When this flag triggers, each unused table is returned with these fields:
| Field | Description |
|---|---|
name | Name of the table |
columnCount | Number of columns in the table |
estimatedRowCount | A fixed 10,000-row assumption — not a measured value. The analyzer hardcodes this for every table. |
estimatedSizeKB | A rough size estimate in kilobytes: columnCount × 10,000 rows × 8 bytes ÷ 1024. Not a true VertiPaq in-memory size. |
Each table object also carries the boolean flags isUnused, isDuplicated, isAutomaticHidden, and isAutoDate.
In the UI, the Tables view shows Name, Column Count, Est. Size (KB), and a Flags column (where the Unused, Auto Hidden, and Auto Date badges appear).
TIP
The analyzer works from a single uploaded file and has no workspace or dataset context, so there is no datasetName or workspaceName in the output — every result describes tables inside the one file you analyzed.
Notes and Edge Cases
- Staging tables — Query-only staging tables that are still exposed to the model but never placed on a visual are flagged, since their names do not appear in the report layout. Consider hiding or removing them.
- Auto date/time and automatic-hidden tables — Tables identified by the Automatic Hidden Tables and Auto Date Tables checks are excluded from the Unused flag: the analyzer forces their
isUnusedflag tofalseso they surface only under their dedicated flags, even though aLocalDateTable_*name would otherwise never appear in the layout. Such a table displays theAuto Hidden/Auto Datebadge but not theUnusedbadge. - Tables used only in RLS — Because the analyzer looks only at the report layout, a table referenced solely in a Row-Level Security expression (and never placed on a visual or filter) will be flagged as unused. Verify manually before removing.
Related Flags
- Unused Columns — Individual columns within an otherwise-used table that are not referenced in the layout.
- Automatic Hidden Tables — System-generated hidden tables, reported separately and excluded from this flag.
- Auto Date Tables — Power BI auto date/time helper tables, reported separately and excluded from this flag.