Model health checklist
Twenty-odd checks you can run in an afternoon.
Structure
- The model is a star schema: facts in the middle, dimensions around them
- Fact tables and dimension tables are named clearly (for example Sales, Dim Customer)
- There is a single date table, marked as a date table
- Relationships are one-to-many and single direction unless there is a reason
- No many-to-many relationships without a documented reason
- No ambiguous or circular filter paths
Columns and data types
- Every column has the right data type (no numbers stored as text)
- Unused columns are removed, not just hidden
- Key and technical columns are hidden from the report view
- High-cardinality text columns (free text, GUIDs) are removed or kept out of the model
- Date-time columns are split into date and time when time is needed
- Column names are friendly and consistent
Measures
- Reports use explicit measures, not implicit aggregations
- Measures are grouped in a measure table or display folders
- Measures have format strings and descriptions
- Division uses DIVIDE, not the / operator
- Repeated logic lives in one base measure that others reuse
- Variables (VAR) are used to avoid recalculating the same expression
Performance
- Performance Analyzer shows no visual taking more than a few seconds
- VertiPaq Analyzer (DAX Studio) was checked for the biggest tables and columns
- Storage mode is chosen on purpose (Import, DirectQuery, Direct Lake)
- Query folding is preserved in Power Query where possible
- Incremental refresh is used for large, append-mostly tables
- Pages have a sensible number of visuals
Security and governance
- Row-level security is defined and tested for each role
- Workspace roles follow least privilege
- Sensitivity labels are applied where required
- The dataset has a named owner and is certified or promoted
- Dev, test and production are separate
Documentation
- Tables and key measures have descriptions
- Refresh schedule and data sources are documented
- There is a one-page diagram of the model
- A change log records who changed what and why