Calculated Columns
Detects calculated columns in semantic models that may impact refresh performance and model size.
What It Detects
This flag identifies all calculated columns in a semantic model — columns defined with a DAX expression that is evaluated and materialized during data refresh, as opposed to columns sourced directly from Power Query / the data source.
Why It Matters
- Increased refresh time — Calculated columns are computed row-by-row during refresh (after all source data is loaded), adding to the total processing time.
- Increased model size — The computed values are stored in the VertiPaq engine just like regular columns, consuming memory.
- Cannot be pushed to source — Unlike Power Query transformations, calculated column logic runs inside the Analysis Services engine and cannot benefit from query folding.
- Often replaceable — Many calculated columns can be replaced with DAX measures (computed at query time, not stored) or moved upstream to Power Query or the data warehouse.
Trigger Conditions
A column is flagged when:
- The column is defined with a DAX expression (i.e., it is a calculated column, not a source column or Power Query computed column). Internally this is the
isCalculatedflag, derived from the presence of a columnexpression.
Threshold: Any calculated column is flagged. This is an awareness flag — not every calculated column is a problem, but each one should be reviewed to confirm it cannot be replaced with a measure or pushed upstream.
Output
Each analyzed column is emitted as a ReportColumnDefinition. The fields relevant to this flag are:
| Field | Description |
|---|---|
name | Fully-qualified column reference in TableName[ColumnName] form (e.g. Sales[Margin]) |
tableName | Parent table name |
dataType | Resulting data type |
estimatedRowCount | Estimated row count (a fixed assumption of 10,000 rows is used) |
estimatedSizeKB | Estimated in-memory size in KB (derived from data type × an assumed 10,000 rows) |
isCalculated | true for calculated columns (derived from the presence of a DAX expression) |
isUnused | Whether the column is referenced anywhere in the report layout |
isDuplicated | Whether the same short column name appears in more than one table |
expression | The full DAX expression (string or string[]); not truncated for this flag |
Note: The analyzer works from a locally uploaded
.pbix/.pbitfile, so there is no workspace or service dataset context at the column level — the output contains nodatasetNameorworkspaceNamefields. The 200-characterexpressionPreviewtruncation applies only to the Complex DAX Columns flag, not to this one.
Notes and Edge Cases
- Legitimate uses — Calculated columns are appropriate when you need a physical column for: relationships, sort-by-column, or Row-Level Security filters. In these cases, the calculated column is expected and can be acknowledged.
- Measures vs. calculated columns — If the calculated column is only used in visuals (never in a relationship or sort-by), it can almost always be converted to a measure, which avoids storing the values and reduces model size.
- Power Query alternative — If the calculation can be expressed in M (Power Query), moving it there enables query folding and removes the DAX engine overhead during refresh.
Related Flags
- Complex DAX Columns — Calculated columns with especially complex DAX expressions.
- Unused Columns — Calculated columns that are defined but never used.