🚀

July 2026 Updates Included

Analytics & Insights (GA): two new tabs beside Recent Runs surface duration trends, success-rate shifts, and error-class frequency across your entire MLV estate. Event-Driven Refresh (Preview): a new scheduling mode that refreshes views the moment upstream data actually lands, instead of on a fixed clock. Lakehouse Query Explorer (GA) also shipped alongside these for instant ad-hoc querying.

What Materialized Lake Views Actually Replace

Before MLVs, a bronze-to-silver-to-gold medallion pipeline meant a chain of notebooks: one to clean bronze data, another to join and enrich it into silver, another to aggregate into gold — each one scheduled separately, each one responsible for figuring out what changed since last run. Materialized Lake Views collapse that into declarative SQL: you describe the end state with a SELECT statement, and Fabric works out execution, storage, and refresh.

Declarative, Not Imperative

You write what you want the data to look like — Fabric determines how to get there and keep it current, rather than you scripting each step.

Persisted as Delta

The result materializes as a real Delta table in your Lakehouse — queryable by any Fabric engine with the same security and governance as any other table.

Dependency-Aware

Fabric automatically detects when one MLV depends on another and orchestrates refresh order so downstream views never read stale upstream data.

Smart Refresh by Default

Every refresh picks incremental, full, or skip automatically based on what actually changed — you don’t write that logic yourself.

The Four-Stage Lifecycle

  1. CreateWrite a SQL query defining the transformation. Fabric stores the definition and materializes the initial result as a Delta table.
  2. RefreshWhen source data changes, Fabric determines the optimal strategy — incremental, full, or skip — based on Change Data Feed.
  3. QueryApplications and reports read the materialized result directly. They have no awareness of the underlying transformation logic.
  4. MonitorRefresh history, execution status, data quality metrics, and dependency lineage are tracked through built-in Fabric tools.

When to Use an MLV — and When Not To

✅ Good Fit

  • Frequently accessed aggregations (daily sales totals, monthly metrics)
  • Complex joins across large tables queried often, needing consistent results for all consumers
  • Data quality transformations that must apply uniformly, defined declaratively
  • Reporting datasets combining multiple sources that benefit from automatic refresh
  • Medallion architecture — bronze → silver → gold defined in SQL

❌ Wrong Tool

  • One-time or rarely accessed queries that don’t benefit from precomputed results
  • Non-SQL logic — ML inference, API calls, complex Python processing (use Spark notebooks)
  • High-frequency streaming data needing subsecond updates (use Real-Time Intelligence instead)
⚠️

Regional and Source Limitations

MLVs aren’t currently available in the South Central US region. They also don’t natively support mirrored databases — the practitioner workaround is a OneLake shortcut from the mirrored database into a Lakehouse, then defining the MLV on the shortcut tables. Lineage for shortcut-based sources doesn’t currently appear in the MLV lineage view.

Spark SQL Syntax

You can define an MLV from any table or from another MLV within the same lakehouse, using either SQL authoring directly in the lakehouse editor, or PySpark authoring from a notebook (currently in preview, full refresh only).

Full CREATE syntax
CREATE [OR REPLACE] MATERIALIZED LAKE VIEW [IF NOT EXISTS] [workspace.lakehouse.schema].MLV_Identifier [( CONSTRAINT constraint_name1 CHECK (condition_expr1) [ON MISMATCH DROP | FAIL], CONSTRAINT constraint_name2 CHECK (condition_expr2) [ON MISMATCH DROP | FAIL] )] [PARTITIONED BY (col1, col2, … )] [COMMENT “description or comment”] [TBLPROPERTIES (“key1”=“val1”, … )] AS select_statement

Real Example — Silver Layer With a Quality Constraint

Cleaned order data, partitioned, with a data quality rule
CREATE OR REPLACE MATERIALIZED LAKE VIEW silver.cleaned_order_data ( CONSTRAINT valid_quantity CHECK (quantity > 0) ON MISMATCH DROP ) PARTITIONED BY (category) COMMENT “Cleaned order data joined from products and orders” AS SELECT p.productID, p.productName, p.category, o.orderDate, o.quantity, o.totalAmount FROM bronze.products p INNER JOIN bronze.orders o ON p.productID = o.productID
CommandPurpose
SHOW MATERIALIZED LAKE VIEWS IN schema;List all MLVs in a schema
SHOW CREATE MATERIALIZED LAKE VIEW name;Retrieve the statement that created an MLV
ALTER MATERIALIZED LAKE VIEW old RENAME TO new;Rename — the only supported ALTER operation
DROP MATERIALIZED LAKE VIEW name;Delete an MLV (also breaks dependent lineage)
REFRESH MATERIALIZED LAKE VIEW name FULL;Force a full refresh, e.g. for troubleshooting

To modify an MLV’s SELECT query, constraints, or partitioning, there’s no ALTER path — use CREATE OR REPLACE. The rename command is the one exception, and it’s rename-only; everything else about the definition requires a full replace.

How Refresh Actually Decides What to Do

Fabric’s decision engine picks the cheapest correct refresh strategy on every run, using Delta Lake Change Data Feed (CDF) to detect what changed at the source.

Incremental Refresh

Processes only new or changed data. Supports aggregations with GROUP BY, left outer and semi joins, and common table expressions (CTEs).

Full Refresh

Rebuilds the entire MLV. Automatic fallback when the query uses constructs incremental refresh doesn’t support, such as window functions.

Skip Refresh

No refresh runs at all when source data hasn’t changed since the last successful run — saving compute for idle periods.

📌

CDF Has to Be Enabled to Get Incremental Refresh

Without Change Data Feed enabled on source tables, optimal refresh can only choose between no refresh and full refresh — incremental isn’t available. Fabric surfaces a banner in the lineage view, recent-runs detail, and individual node level listing MLVs that are eligible for incremental refresh but blocked because CDF isn’t enabled. Select Activate CDF in that banner to fix it in one step — it has no measurable storage or performance cost for append-only workloads.

Using an unsupported construct (window functions, non-deterministic functions) doesn’t break your MLV — Fabric just falls back to full refresh instead of failing. You don’t need to force this manually; it’s automatic.

Built-In Data Quality Constraints

Constraints are defined directly in the CREATE statement and enforced on every refresh — no separate validation job required.

Constraint syntax
CONSTRAINT valid_sales CHECK (sales_amount > 0) ON MISMATCH DROP
ON MISMATCH ActionBehavior
DROPSilently removes the violating row from the materialized result
FAILStops the refresh entirely with an error — this is the default if omitted
⚠️

Constraints Only Run at Refresh Time

Constraints are enforced during refresh, not on every query. Fabric materializes the result of the SELECT once and serves that stored result — it doesn’t re-validate rows on each read.

Analytics & Insights, and Event-Driven Refresh

Analytics & Insights (GA, July 2026)

Two new tabs sit beside Recent Runs in the MLV monitoring view. Where Recent Runs tells you what happened in a single execution — which views succeeded, which failed, how long the job took — Analytics & Insights answers the questions that matter across your whole estate over time: are durations climbing? Is a new error class spreading across views? The Analytics tab turns run history into trend lines, distributions, and comparisons — duration trajectories, success-rate shifts, error-class frequency over time — readable at a glance.

Event-Driven Refresh (Preview, July 2026)

A new scheduling mode alongside time-based schedules. Time-based schedules are dependable when upstream data lands like clockwork — every hour, every morning — but they can’t answer the operational question that actually matters: is my data fresh right now? Event-driven refresh triggers the moment upstream data is actually ready, instead of on an arbitrary calendar interval.

Combined With Multi-Schedule Support

Together, multi-schedule support and event-driven refresh move refresh management from a fixed-clock, guess-the-cadence posture to a responsive, data-driven one — keeping MLVs fresh the instant new data arrives, and idle when it hasn’t, as your estate of views grows.

Dependency Management & Orchestration

When one MLV’s SELECT statement references another MLV or table, Fabric automatically detects that relationship and manages execution order — you don’t build an orchestration DAG by hand.

Manage Refresh From the Lakehouse, Not From a Notebook

  • Lineage: open the Materialized Lake Views tab in the ribbon, select Manage, and Fabric derives dependency order automatically from your view definitions — follow runs in progress, inspect upstream and downstream dependencies for each view.
  • Scheduled refresh: from the same Manage view, create one or more schedules for all MLVs or a selected subset. Each schedule refreshes views in dependency order, so downstream views always read fresh upstream data. Fabric retries transient failures for you.

For pipeline orchestration outside the built-in scheduler, the Refresh Materialized Lake View activity is also available in Fabric Data Factory pipelines — useful for chaining a refresh after a Copy activity or upstream notebook run. As of this writing, that activity doesn’t support service principal or workspace identity authentication.

The clear practitioner guidance from Microsoft here is worth taking literally: use notebooks to author and iterate on MLV definitions, then let the built-in lineage and scheduled refresh handle ordering, execution, and retries. Building your own orchestration notebook to poll and refresh MLVs in sequence — a common pattern before this matured — bypasses dependency management and centralized error reporting that the platform already gives you for free.

Current Limitations

LimitationDetail
No DML statementsINSERT, UPDATE, DELETE aren’t supported — data is populated only by the defining SELECT
No time-travel queriesThe defining query can’t use Delta Lake time travel syntax (VERSION AS OF, TIMESTAMP AS OF)
No user-defined functionsUDFs aren’t supported in the SELECT that defines an MLV
No temporary views as sourcesYou can reference tables and other MLVs, but not temp views
All-uppercase schema names unsupportedUse mixed case or lowercase schema names
Session-level Spark config ignored on schedulespark.conf.set(...) at session level doesn’t apply during a scheduled refresh — set at lakehouse or workspace level instead
PySpark authoring is full-refresh onlyPreview status; optimal (incremental) refresh support for PySpark-authored MLVs is planned but not yet available
Not available in South Central USRegional availability gap as of this writing

Frequently Asked Questions

What is a materialized lake view in Microsoft Fabric?
A materialized lake view (MLV) in Fabric is a persisted, automatically refreshed view defined in Spark SQL or PySpark. You write a SELECT statement describing the transformation, and Fabric handles execution, storage as a Delta table, and refresh — so downstream consumers query it like any other Lakehouse table without re-running the underlying logic.
Are Materialized Lake Views generally available?
Yes. MLVs reached general availability in March 2026 at FabCon and SQLCon Atlanta, adding multi-schedule support, broader incremental refresh, PySpark authoring, in-place updates, and stronger data quality controls on top of the original 2025 preview. PySpark authoring specifically remains in preview and currently performs full refresh only.
When should I use a materialized lake view instead of a notebook?
Use an MLV for frequently accessed aggregations, complex joins across large tables queried often, declarative data quality rules, reporting datasets combining multiple sources, or medallion bronze-to-silver-to-gold transformations. Use a notebook instead for one-time queries, non-SQL logic like ML inference or API calls, or high-frequency streaming data under a second of latency, which fits Real-Time Intelligence better.
How does incremental refresh work for materialized lake views?
Fabric detects source data changes through Delta Lake Change Data Feed (CDF) and chooses incremental, full, or skip refresh automatically. Incremental refresh supports aggregations with GROUP BY, left outer and semi joins, and common table expressions. If a query uses unsupported constructs such as window functions, Fabric still refreshes correctly but falls back to a full refresh instead of failing.
What is Event-Driven Refresh for materialized lake views?
Event-Driven Refresh, introduced in preview in the July 2026 Fabric update, is a new scheduling mode alongside time-based schedules that refreshes materialized lake views the moment upstream data actually lands, instead of on a fixed clock interval. Combined with multi-schedule support, it moves refresh management from guessing a cadence to responding to real data arrival.
Can I run INSERT or UPDATE statements against a materialized lake view?
No. Materialized lake views don’t support DML statements such as INSERT, UPDATE, or DELETE. Data is populated only by the SELECT query in the view’s definition — to change the data, you modify the source tables or the MLV definition itself using CREATE OR REPLACE.
Do materialized lake views work with mirrored databases?
Not directly. Mirrored databases don’t natively support materialized views. The practitioner workaround is to create a OneLake shortcut from the mirrored database into a Lakehouse, then define the materialized lake view on the shortcut tables using Spark SQL. Lineage for shortcut-based source tables doesn’t currently appear in the MLV lineage UI.

⚠️ Accuracy Disclaimer

This guide is verified against Microsoft Learn — Overview of Materialized Lake Views, the Spark SQL Reference, and the July 2026 Feature Summary at time of writing. Feature availability, refresh behavior, and regional support change frequently. Always verify against official documentation before production deployment. UIG Data Lab is an independent publication, not affiliated with or endorsed by Microsoft Corporation.

AJ
A.J. Data Engineering Researcher & Technical Writer · UIG Data Lab All articles →

A.J. researches and writes about data engineering, analytics architecture, Microsoft Fabric, and modern cloud data platforms. Coverage spans Microsoft Fabric, Power BI, Azure Data Engineering, Databricks, Snowflake, Apache Spark, dbt, Apache Airflow, and modern cloud data infrastructure. The focus is practitioner-level content that helps data professionals understand platform capabilities, evaluate technology decisions, optimize costs, and implement practical solutions using official documentation, product updates, community insights, and industry best practices. His writing covers real decisions from real deployments — not documentation rewrites.

Microsoft Fabric Materialized Lake Views Delta Lake Medallion Architecture Spark SQL Data Engineering OneLake Data Quality