Partition properties
Note
This page was created with the help of AI.
This page covers the properties of partitions, incremental refresh policies and data coverage definitions. For properties that most objects share, see Common properties.
A partition defines where one part of a table's data comes from. Every table except a calculation group has at least one partition, and most tables have exactly one. Each kind of partition describes its source differently:
| Kind | Source Type | Where the data comes from |
|---|---|---|
| Legacy (query) partition | Query |
A native query, usually SQL, against a legacy (provider) data source. |
| Calculated partition | Calculated |
The DAX expression of a calculated table. |
| M partition | M |
A Power Query (M) expression. Power BI and most modern models use this kind. |
| Entity partition | Entity |
A named entity, such as a Delta table in a lakehouse or warehouse. Direct Lake tables use this kind. |
| Policy range partition | PolicyRange |
A date range of the table's incremental refresh policy. The engine creates these partitions. |
All kinds share the properties under Properties of all partitions. The later sections list the properties specific to one kind.
Properties of all partitions
These properties apply to every kind of partition. The Properties view only shows the ones that apply to the selected kind, for example Query only on legacy partitions and QueryGroup only on M partitions. When a table has a single partition with the same name as the table, renaming the table also renames the partition.
Common properties
Data Source
DataSource · DataSource · Basic
The data source that the partition's query runs against. Tabular Editor shows this property on legacy (query) partitions and on entity partitions, where you pick one of the model's data sources from the dropdown. Policy range partitions also list the property, but it's always empty there.
M partitions don't use this property. Their M expression names the source directly, for example Sql.Database("myserver", "mydb"), or refers to a structured data source or shared expression. See Data source and expression properties.
Expression
Expression · string · Basic
The expression that fills the partition with data. The Properties view only shows it on calculated partitions, where it holds the DAX expression of the calculated table. On legacy partitions the same text appears as Query, and on M partitions as MExpression.
The TOM Explorer doesn't show the partitions of calculated tables (field parameters included) or of calculation groups. Edit the DAX expression through Expression on the calculated table, or open the partition's properties with the Edit Hidden Partitions script.
In a C# script, Expression reads and writes the expression of legacy, calculated and M partitions alike. Setting it on any other kind of partition, such as an entity partition, throws an error.
Query
Query · string · Basic
The native query that the engine sends to the legacy data source to fill the partition, for example:
SELECT * FROM dbo.FactSales WHERE OrderDate >= '2024-01-01'
Query only appears on legacy (query) partitions. It's an alias for Expression, and both names read and write the same value. The engine sends the query as-is, so write it in the source's own dialect. If you split a large table into several legacy partitions and their WHERE clauses overlap or leave gaps, rows load twice or not at all.
In Tabular Editor 3, a refresh override profile replaces the query of a partition for a single refresh, for example to load only the top 10,000 rows during development. See Refresh Override Profiles.
Last Processed
RefreshedTime · DateTime · Metadata · read-only
The date and time the engine last refreshed the partition. Use it to confirm that a refresh reached a partition, for example after a scheduled refresh or an incremental refresh that only refreshes the most recent partitions.
A model that you open from a file shows the value stored in the file, if any. The value is only reliable when you're connected to a server or working in Workspace Mode.
When the Ignore timestamps serialization option is on (the default, see @preferences), Tabular Editor leaves timestamps out when it saves the model to a .bim file or a folder in the JSON format. These timestamps are RefreshedTime and the modified times of the model and its objects. Tabular Model Definition Language (TMDL) never stores timestamps, so a model saved as TMDL has no RefreshedTime value, whatever the option is set to.
In Tabular Editor 3, refresh a single partition by right-clicking it in the TOM Explorer and choosing Refresh partition and the type of refresh. The Data Refresh view shows the progress of the refresh.
DataCoverageDefinition
DataCoverageDefinition · DataCoverageDefinition · Options · compatibility level 1603+
The optional data coverage definition of the partition, which describes the rows a DirectQuery partition holds. When a query only asks for rows outside that range, the engine skips querying the source. Hybrid tables use it on the DirectQuery partition that holds the recent data, next to the imported partitions with older data.
Tabular Editor shows this property at compatibility level 1603 and higher, on partitions in DirectQuery or Dual mode and on any partition that already has a data coverage definition. Use the property's actions to add or remove the definition or to edit its expression. On the same partitions, the Expression Editor lists the data coverage definition expression, and typing an expression there on a partition without a definition adds one.
Data View
DataView · DataViewType · Options
For DirectQuery models in Analysis Services: whether the partition holds all data or a sample of it. A sample partition holds a small, imported subset of a DirectQuery table for designing the model in Visual Studio. Queries from client tools use the full data.
| Value | Meaning |
|---|---|
Full |
The partition holds the complete data. |
Sample |
The partition holds a sample of the data, for use while designing the model. |
Default |
The partition uses DefaultDataView of the model. |
The Tabular Object Model (TOM) defines only these three values. According to Microsoft's documentation on DirectQuery mode, the Set as Sample feature of the Visual Studio model designer is currently not supported. Power BI doesn't use data views, so leave this property at its default in Power BI and Fabric models.
Mode
Mode · ModeType · Options
The storage mode of the partition, which sets how the engine gets to the data in it.
| Value | Meaning |
|---|---|
Import |
Data is loaded into the model's memory at refresh time. Queries don't go to the source. |
DirectQuery |
Data stays in the source. Each query is translated into a query against the source, for example SQL. |
Dual |
The partition acts as Import or DirectQuery, whichever gives the better query in a composite model. Typically used for dimension tables that relate to both imported and DirectQuery fact tables. Compatibility level 1455+. |
DirectLake |
Data is read directly from Delta tables in OneLake and loaded into memory on demand. Fabric only. Used with entity partitions. Compatibility level 1604+. Not available in Tabular Editor editions without Direct Lake support. See Direct Lake Guidance. |
Push |
Data is pushed into the partition through the Power BI REST API, as in a push semantic model. There is no source query. Only the Power BI service supports it. |
Default |
The partition uses DefaultMode of the model. See Model properties. |
The mode is set per partition, and all partitions of a table usually have the same mode. The main exception is a hybrid table, where an incremental refresh policy imports the historical partitions and keeps the most recent one in DirectQuery mode (see Mode under Refresh policy).
Switching a table from Import to DirectQuery removes its imported data, and some features, such as calculated columns that use certain DAX functions, don't work in DirectQuery. To convert a Direct Lake table to import or back, see Convert Direct Lake on OneLake to import and Convert Import to Direct Lake on OneLake.
Tabular Editor accepts any combination of modes. When you save, the engine rejects the combinations it doesn't support, and SQL Server Analysis Services is much stricter than Power BI. SQL Server 2025 Analysis Services:
- rejects
Dualpartitions with the errormay not operate in Dual mode - rejects models that mix imported data with DirectQuery, both within a table and across tables, so composite models and hybrid tables aren't possible
- allows only one
DirectQuerypartition per table
The one mix it accepts is the older DirectQuery pattern of one DirectQuery partition plus Import partitions with DataView set to Sample.
The Power BI service accepts an Import and a DirectQuery partition in the same table, even without a refresh policy. Dual tables and relationships between imported and DirectQuery tables in either direction also work there. The service keeps the rule of one DirectQuery partition per table, and it rejects a DirectQuery or Dual partition whose expression doesn't refer to a data source, such as one built from literal data with #table.
Query Group
QueryGroup · QueryGroup · Options · compatibility level 1480+
The query group (folder) that the partition's M query appears in, in the Power Query editor of Power BI Desktop. It only organizes queries in that editor and doesn't affect refresh or the field list. Tabular Editor shows this property on M partitions only, where you pick one of the model's query groups from the dropdown or leave it empty. For query groups, see Data source and expression properties.
Source Type
SourceType · PartitionSourceType · Options · read-only
The kind of partition, set when the partition is created. To change the kind, create a new partition of the right kind and delete the old one.
| Value | Meaning |
|---|---|
Query |
A legacy partition with a native query against a provider data source. |
Calculated |
The partition of a calculated table, filled by a DAX expression. |
None |
The partition has no source. The data is pushed into it, for example in a push semantic model. |
M |
An M partition with a Power Query (M) expression. |
Entity |
An entity partition that reads a named entity, such as a table in a lakehouse. Direct Lake uses this kind. |
PolicyRange |
A partition generated by an incremental refresh policy. |
CalculationGroup |
The partition of a calculation group table. It holds no source; the engine fills it from the calculation items. |
Inferred |
A partition for which the engine generates the query itself. Compatibility level 1563+. |
TOM also defines the value Parquet, for an internal compatibility level that Microsoft doesn't release, so it doesn't appear in your models.
Legacy and calculated partitions
Legacy (query) partitions and calculated partitions have no properties beyond the ones under Properties of all partitions.
- a legacy partition (
Query) usesDataSourceandQuery. Models use it with provider data sources, typically in Analysis Services models below compatibility level 1400. See Import Tables. The Best Practice Analyzer (BPA) rule Avoid Provider Partitions with Structured Data Sources flags legacy partitions that use a structured data source, a combination that Power BI doesn't support. - a calculated partition (
Calculated) belongs to a calculated table and usesExpression. Edit the DAX expression on the calculated table itself (seeExpressionon @object-properties-tables). The TOM Explorer doesn't show the partitions of calculated tables. To open one, use the Edit Hidden Partitions script.
M partition
An M partition fills the table with the result of a Power Query (M) expression. It's the default kind of partition in Power BI models and in Analysis Services models at compatibility level 1400 and higher. The M expression typically starts from a source function, such as Sql.Database, or from a shared expression, and ends with the table to load.
Common properties
The same as on all partitions.
Attributes
Attributes · string · Options
Extra M attributes stored with the partition's source. Most models leave it empty, and Power BI Desktop leaves it empty, also on tables with an incremental refresh policy.
M Expression
MExpression · string · Options
The Power Query (M) expression that returns the data for the partition. Edit it in the Expression Editor. For example:
let
Source = Sql.Database("myserver", "AdventureWorks"),
Sales = Source{[Schema = "dbo", Item = "FactInternetSales"]}[Data]
in
Sales
The expression must return a table whose columns match the SourceColumn values of the table's data columns (see @object-properties-columns). If a column is renamed or removed in the source, refresh fails until you update the table's columns, for example with Update table schema (see @import-tables).
Parts that several partitions share, such as the server name, can go in a shared expression or an M parameter that the expressions refer to by name. See Create M Parameter. In Tabular Editor 3, Create M Parameter (Auto-Replace) also replaces the value with the new parameter in all M partitions.
In Tabular Editor 3, the Format Power Query script formats the M expression of the selected partition through an external formatting service.
Entity partition
An entity partition reads its data from a named object, an entity. Each Direct Lake table has one entity partition that points to a Delta table in a Fabric lakehouse or warehouse. A shared expression holds the connection to the lakehouse or warehouse, and the partition refers to it through ExpressionSource.
See Direct Lake on SQL Semantic Models and Direct Lake Guidance. In Tabular Editor 3, the Import Tables wizard creates Direct Lake tables from a Fabric lakehouse or warehouse.
Common properties
The same as on all partitions.
Entity Name
EntityName · string · Options
The name of the source object the partition reads, for example the Delta table FactSales in the lakehouse. Like a column's SourceColumn, it has to match the source exactly. Renaming the table in the model doesn't change the entity name, so the table can have a friendlier name than the source. If the source table is renamed, update EntityName to match, or the partition fails the next time the model is framed or refreshed.
If your changes to EntityName revert after you refresh the model in Power BI, see Entity Name Changes Revert in Direct Lake Models.
Expression Source
ExpressionSource · NamedExpression · Options
The shared expression that holds the connection to the source. In a Direct Lake model this is typically a shared expression named DatabaseQuery, the name that the Tabular Editor 3 import wizard gives it. Its M expression depends on the kind of Direct Lake:
- Direct Lake on SQL:
Sql.Database("<SQL endpoint>", "<lakehouse or warehouse name>") - Direct Lake on OneLake:
AzureStorage.DataLake("https://onelake.dfs.fabric.microsoft.com/<workspace ID>/<item ID>", [HierarchicalNavigation=true])
Tabular Editor tells the two kinds apart by the M function in this shared expression, and treats an entity partition without an expression source as Direct Lake on SQL. All Direct Lake tables of a model usually point to the same shared expression.
To point a Direct Lake model to a different lakehouse or warehouse, for example when you move it from development to production, change the M expression of that shared expression. The partitions keep pointing to it. The Convert Direct Lake on SQL to OneLake script switches a model from Direct Lake on SQL to Direct Lake on OneLake by changing the same M expression.
Schema Name
SchemaName · string · Options · compatibility level 1604+
The schema of the source object, for lakehouses and warehouses that use schemas, for example dbo or sales. Leave it empty when the source has no schemas. Together with EntityName, it identifies the source table.
Microsoft's documentation describes this property as reserved for future use. Tabular Editor shows it at compatibility level 1604 and higher.
Policy range partition
A policy range partition holds one date range of a table that uses incremental refresh. The engine creates, merges and removes these partitions when it applies the table's refresh policy, for example during a refresh in the Power BI service or when you choose Apply Refresh Policy in Tabular Editor. Each partition covers one period, such as a day, a month, a quarter or a year, and older periods are merged into bigger partitions as they age. The M query of a policy range partition is SourceExpression of the refresh policy, with the partition's Start and End as the values of RangeStart and RangeEnd.
See What is a Refresh Policy?, Set Up a New Refresh Policy and Modify an Existing Refresh Policy. In Tabular Editor 3, the Advanced Refresh Dialog dialog applies the refresh policy as part of a refresh with an effective date that you pick, to test how the policy behaves at another point in time. When you deploy from Tabular Editor 3, you can leave out the partitions that a refresh policy governs. See Model deployment.
Common properties
The same as on all partitions.
End
End · DateTime · Refresh Policy
The end of the date range the partition covers. The partition holds the rows dated before End, and the engine passes the value as RangeEnd when it refreshes the partition. The engine sets it when it applies the refresh policy.
Granularity
Granularity · RefreshGranularityType · Refresh Policy
The size of the period the partition covers.
| Value | Meaning |
|---|---|
Day |
One day. |
Month |
One calendar month. |
Quarter |
One calendar quarter. |
Year |
One calendar year. |
Invalid |
No granularity is set. |
Recent periods are usually small (days or months) and are merged into larger ones (quarters, then years) as they move out of the incremental refresh window.
RefreshBookmark
RefreshBookmark · string · Refresh Policy · read-only
The value that PollingExpression of the refresh policy returned for this partition at its last refresh, for example the latest modified date in the partition's range. It's empty when the policy has no polling expression. On the next refresh, the engine evaluates the polling expression again and only refreshes the partition if the value has changed. Detect data changes in Power BI Desktop works this way.
The property is read-only in Tabular Editor and in the TOM library, but a Tabular Model Scripting Language (TMSL) alter command can set refreshBookmark on a partition, for example to an empty string. On the next refresh with the refresh policy applied, the engine compares the polling result with the stored bookmark and only refreshes the partitions where they differ, so changing the bookmark forces a refresh of that partition. A refresh with applyRefreshPolicy set to false refreshes the partitions without reading or updating the bookmarks.
Start
Start · DateTime · Refresh Policy
The start of the date range the partition covers. The partition holds the rows dated on or after Start, and the engine passes the value as RangeStart when it refreshes the partition. Like End, the engine sets it when it applies the refresh policy.
Refresh policy
A refresh policy defines how the engine partitions and refreshes a table incrementally: how much history to keep (the rolling window), how much of the most recent data to refresh each time (the incremental window) and the M query for each partition. The engine uses the policy to create and maintain the table's policy range partitions.
The refresh policy is on its table, under Incremental Refresh in the Properties view. Set Enabled (EnableRefreshPolicy) to true on the table, then expand Refresh Policy to edit the properties below. See RefreshPolicy on Table properties.
With RollingWindowPeriods set to 5, RollingWindowGranularity to Year, IncrementalPeriods to 10 and IncrementalGranularity to Day, the table keeps five years of history and each refresh only reloads the last ten days.
See What is a Refresh Policy?, Incremental Refresh, Set Up a New Refresh Policy, Modify an Existing Refresh Policy and Add or Remove Columns in a Table that uses Incremental Refresh. The Setup Incremental Refresh script sets up a refresh policy for an import table from a date column you select, including the RangeStart and RangeEnd parameters.
Common properties
Incremental Granularity
IncrementalGranularity · RefreshGranularityType · Options
The unit of IncrementalPeriods: Day, Month, Quarter or Year. Invalid means the policy isn't configured yet. The unit is also the size of the partitions in the incremental window, for example one partition per day of the refreshed range for Day.
Incremental Periods
IncrementalPeriods · int · Options
How many periods, counted back from today, the engine refreshes on each refresh. With IncrementalGranularity set to Day and IncrementalPeriods to 10, each refresh reloads the last ten days and leaves older partitions alone. A larger window makes refreshes slower, and a window that's too small misses changes to older rows.
Incremental Periods Offset
IncrementalPeriodsOffset · int · Options
Shifts the incremental window relative to today, in units of IncrementalGranularity:
0ends the window with the current period- a negative value moves it into the past, for example
-1withDayrefreshes up to and including yesterday, so the table only holds complete days - a positive value moves it into the future, for sources that contain future-dated rows such as forecasts
The Only refresh complete days option in the incremental refresh dialog of Power BI Desktop sets IncrementalPeriodsOffset to -1.
Mode
Mode · RefreshPolicyMode · Options · compatibility level 1565+
Whether the most recent period is imported too or kept in DirectQuery to show real-time data.
| Value | Meaning |
|---|---|
Import |
All partitions, including the most recent one, are imported. Data is only as fresh as the last refresh. |
Hybrid |
The historical partitions are imported, and the engine adds a DirectQuery partition for the rows after the incremental window. Queries always see the latest rows in the source, and the table becomes a hybrid table. Power BI Premium, Premium Per User and Power BI Embedded only. |
A hybrid table sends queries for the current period to the source. A data coverage definition on the DirectQuery partition avoids source queries for rows outside the current period. Microsoft recommends Dual storage mode for the tables related to a hybrid table.
Policy Type
PolicyType · RefreshPolicyType · Options · read-only
The kind of refresh policy. The only value is Basic, the policy described on this page, and you can't change it in Tabular Editor.
Polling Expression
PollingExpression · string · Options
An optional M expression that the engine evaluates for each partition in the incremental window before it refreshes the partition. It usually returns the latest modified date or a row count for the partition's range. The engine stores the result in the partition's RefreshBookmark and only refreshes the partition when the value has changed since the last refresh. When the property is empty, every partition in the incremental window refreshes every time.
The expression can use RangeStart and RangeEnd, like SourceExpression. This example returns the latest modified date in the partition's range:
let
Source = Sql.Database("myserver", "AdventureWorks"),
Sales = Source{[Schema = "dbo", Item = "FactInternetSales"]}[Data],
InRange = Table.SelectRows(Sales, each [OrderDate] >= RangeStart and [OrderDate] < RangeEnd),
LastModified = List.Max(InRange[ModifiedDate])
in
LastModified
Power BI Desktop fills this property when you select Detect data changes in the incremental refresh dialog. In Tabular Editor, edit the polling expression in the Expression Editor by selecting the table and picking Polling Expression from the dropdown. See Configure 'Detect Data Changes'.
Rolling Window Granularity
RollingWindowGranularity · RefreshGranularityType · Options
The unit of RollingWindowPeriods: Day, Month, Quarter or Year. Invalid means the policy isn't configured yet.
Rolling Window Periods
RollingWindowPeriods · int · Options
How many complete periods of history, counted back from today, the table keeps on top of the current, incomplete period. With RollingWindowGranularity set to Year and RollingWindowPeriods to 5, the table holds the last five whole years in year partitions, plus the current year so far in quarter, month or day partitions. When a period falls out of the window, the engine removes its partition and the data in it at the next refresh.
The rolling window must be larger than the incremental window, which is its most recent part.
Source Expression
SourceExpression · string · Options
The M expression that the engine uses as the query for every policy range partition it creates. It must filter the source on a date column with the M parameters RangeStart and RangeEnd, which the engine sets to each partition's Start and End. For example:
let
Source = Sql.Database("myserver", "AdventureWorks"),
Sales = Source{[Schema = "dbo", Item = "FactInternetSales"]}[Data],
InRange = Table.SelectRows(Sales, each [OrderDate] >= RangeStart and [OrderDate] < RangeEnd)
in
InRange
Use >= on one parameter and < on the other. With >= and <=, a row that falls exactly on a boundary loads into two partitions.
RangeStart and RangeEnd must exist in the model as M parameters (shared expressions) of type DateTime. If the date column in the source is an integer key such as 20240131, convert the parameters to that format inside the filter step. If the filter doesn't fold to the source, the source returns all rows for every partition.
Policy range partitions don't store a query of their own, and each refresh of one uses the current SourceExpression. A change takes effect on the next refresh, but only for the partitions that refresh reprocesses. A refresh with the refresh policy applied, which is what the Power BI service runs, only reprocesses the incremental partitions, and the historical partitions keep the data they loaded with the old expression. To reload all of them with the new expression, run a full refresh of the table with applyRefreshPolicy set to false.
Data coverage definition
A data coverage definition describes, as a DAX expression, which rows a partition holds. The engine uses it to skip a DirectQuery partition when a query only asks for rows that the partition can't contain. In a hybrid table without one, every query on the table also queries the source through the DirectQuery partition, even when the query only asks for last year's data that's already imported.
The definition belongs to a single partition. Add it through DataCoverageDefinition on the partition.
Common properties
Expression
Expression · string · Options
A DAX expression that returns TRUE for the rows the partition covers. For example, for a DirectQuery partition that only holds the current year:
RELATED ( 'Date'[Year] ) = 2026
The engine trusts the expression and doesn't check it against the data. If the expression excludes a row that the partition holds, queries silently leave that row out, so update the expression when the partition's query changes.
To edit it, select the partition in the TOM Explorer and pick the data coverage definition expression in the dropdown of the Expression Editor.
The engine doesn't validate the expression when you save. SQL Server 2025 Analysis Services accepted every expression tried, including column filters, IN lists, RELATED and text that isn't DAX at all, and it also accepts a definition on an Import partition, where the definition has no purpose. Check the expression yourself before you deploy.
Partition
Partition · Partition · Options · read-only
The partition this data coverage definition belongs to. The Properties view doesn't show it. In C# scripts, use it to get from the definition back to its partition.