Skip to content

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 tablesLocalDateTable_* tables Power BI creates for date/datetime columns when "Auto date/time" is enabled (name matches ^localdate).
  • Template / parameter tables — tables whose names contain templatable or parametertable.
  • 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):

  1. The table is marked hidden in the model. Any hidden table is flagged immediately.
  2. The table name matches a known system-table pattern (see the list below).
  3. 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
^localdateLocalDateTable_* and other names starting with "LocalDate"
^date…hierarchyDate hierarchy tables
^calendar…autoAuto-generated calendar tables
^time…intelligenceTime-intelligence tables
^_…measuresSystem measures tables
^datatable(, ^values(, ^summarize(, ^filter(Tables named after DAX functions
^$…systemSystem-generated tables
^__Double-underscore-prefixed tables
parametertableParameter tables
templatableTemplate tables

Note on DateTableTemplate_*: These are not matched by any name pattern (the templatable pattern 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:

FieldDescription
nameTable name (e.g., LocalDateTable_xxxxxxxx)
columnCountNumber of columns in the table
estimatedRowCountEstimated row count (a fixed placeholder of 10,000, not a measured value)
estimatedSizeKBEstimated size in KB, derived from columnCount × 10,000 rows × ~8 bytes/cell
isAutomaticHiddentrue for tables detected by this flag (drives the Auto Hidden badge)
isAutoDatetrue if the table is also a LocalDateTable_* auto date/time table (separate Auto Date badge)
isUnusedtrue if unused — but this is forced to false for auto-hidden / auto-date tables so they are not double-flagged
isDuplicatedtrue if the table name appears more than once in the model
autoDateInfoPresent 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/.pbit file, 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.

  • 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.