Automatic Hidden Tables
Detects hidden and system-generated tables in the model — tables that Power BI (or DAX) creates and hides for internal use, such as auto date/time helper tables, template/parameter tables, and system-prefixed tables. These add hidden weight to the model without appearing in the field list.
This flag (
automaticHiddenTables, shown with the Auto Hidden badge) is a broad hidden/system-table detector. The specific auto date/time calendar tables (LocalDateTable_*) are additionally surfaced by a separate flag with its own Auto Date badge — see Auto Date Tables.
What It Detects
This flag identifies tables that are either marked hidden in the model or match the structure/naming of an internal system table, including:
- Hidden tables — any table flagged as hidden in the model is reported, regardless of whether it is referenced by relationships, measures, or visuals.
- Auto date/time helper tables —
LocalDateTable_*tables Power BI creates for date/datetime columns when "Auto date/time" is enabled (name matches^localdate). - Template / parameter tables — tables whose names contain
templatableorparametertable. - System-prefixed tables — names starting with
__, containing$, matching$…system, or starting with_. - Empty or private tables — tables marked private, marked "show as variations only", or containing no columns and no measures.
Why It Matters
- Model bloat — Hidden system tables add columns and rows that count toward the model size but are invisible in the field list, so developers often do not know they exist.
- Memory consumption — In models with many date columns, the auto date/time helper tables alone can account for a large share of the model's memory footprint. (These specific tables are called out separately on the Auto Date Tables page.)
- Slower refresh — Hidden calculated helper tables are recomputed during refresh.
- Non-obvious impact — Because the tables are hidden, their cost is easy to overlook when reviewing the model.
Trigger Conditions
A table is flagged when any of the following are true. (Whether the table is referenced by a relationship, measure, or visual is not considered — a referenced hidden table is still flagged.)
For tables read from an embedded model (DataModelSchema):
- The table is marked hidden in the model. Any hidden table is flagged immediately.
- The table name matches a known system-table pattern (see the list below).
- The table has structural markers of a system table: it is private, is "show as variations only", has no columns and no measures, contains a
$in its name, or starts with_.
For tables recovered from a service-exported dataset (DatasetSchema, no embedded model):
- The table is marked hidden, or its name matches a system-table pattern. (The structural-marker checks in condition 3 are not available on this path.)
System-table name patterns
| Pattern (case-insensitive) | Matches |
|---|---|
^localdate | LocalDateTable_* and other names starting with "LocalDate" |
^date…hierarchy | Date hierarchy tables |
^calendar…auto | Auto-generated calendar tables |
^time…intelligence | Time-intelligence tables |
^_…measures | System measures tables |
^datatable(, ^values(, ^summarize(, ^filter( | Tables named after DAX functions |
^$…system | System-generated tables |
^__ | Double-underscore-prefixed tables |
parametertable | Parameter tables |
templatable | Template tables |
Note on
DateTableTemplate_*: These are not matched by any name pattern (thetemplatablepattern does not match the substring "DateTableTemplate"). They are flagged only incidentally via their hidden/private flags, not by name.
Threshold: There is no numeric threshold — any table meeting a condition above is flagged.
Output
Each flagged table is reported as a table definition with the following fields:
| Field | Description |
|---|---|
name | Table name (e.g., LocalDateTable_xxxxxxxx) |
columnCount | Number of columns in the table |
estimatedRowCount | Estimated row count (a fixed placeholder of 10,000, not a measured value) |
estimatedSizeKB | Estimated size in KB, derived from columnCount × 10,000 rows × ~8 bytes/cell |
isAutomaticHidden | true for tables detected by this flag (drives the Auto Hidden badge) |
isAutoDate | true if the table is also a LocalDateTable_* auto date/time table (separate Auto Date badge) |
isUnused | true if unused — but this is forced to false for auto-hidden / auto-date tables so they are not double-flagged |
isDuplicated | true if the table name appears more than once in the model |
autoDateInfo | Present only for auto-date tables: { sourceTable, sourceColumn } — the column that generated it |
There is no dataset or workspace field: this flag analyzes a local
.pbix/.pbitfile, not a published semantic model. Row count and size are rough estimates (a fixed 10,000-row assumption × ~8 bytes per cell), not measured values.
Notes and Edge Cases
- Auto date/time is the most common source — To prevent Power BI from creating
LocalDateTable_*helper tables, go to Power BI Desktop > File > Options > Current File > Data Load and uncheck "Auto date/time" (or set it as a default under Global > Data Load). See Auto Date Tables for the memory/refresh detail specific to those tables. - Existing explicit date table — If your model already has a dedicated Date/Calendar dimension marked as a date table, the auto date/time helper tables are redundant.
- Hidden by design — Some hidden tables are intentional (e.g., disconnected helper or configuration tables). This flag reports every hidden table, so treat it as a "review these" signal rather than an automatic "delete" instruction.
- Not deduplicated against Unused — Auto-hidden and auto-date tables are deliberately excluded from the Unused Tables flag so a single table is not shown with both an "Unused" and an "Auto Hidden" badge.
Related Flags
- Auto Date Tables — The dedicated flag for
LocalDateTable_*auto date/time tables, with the source column that generated each one (Auto Date badge). - Unused Tables — Tables not referenced anywhere in the report. Auto-hidden/auto-date tables are excluded from that flag to avoid double-badging.
- Unused Columns — Columns inside hidden helper tables are excluded from the Unused flag for the same reason.