Setting V-Order for delta tables in Microsoft Fabric

Microsoft recently made a change that caught a lot of people off guard: they disabled V-Ordering by default for new Fabric lakehouses. If you’re using Power BI Direct Lake mode, this matters—a lot. V-Ordering can dramatically improve your query performance, but it comes with tradeoffs.

Today I’m going to show you how to check if V-Ordering is enabled in your lakehouse, how to enable it for specific tables, and when you should (and shouldn’t) use it. This is going to be a quick one, so let’s dive in.

What Is V-Ordering and Why Should You Care?

V-Ordering is a read optimization technique for Delta tables in Microsoft Fabric lakehouses. When a table is V-Ordered, the data is physically organized in a way that makes reading it much faster. This is especially important if you’re using Power BI Direct Lake mode, where your reports query the lakehouse directly without importing data.

However, V-Ordering comes with a cost. It’s computationally expensive to apply, which means it uses up more of your capacity units (CUs). And if you’re doing a lot of writes to a table, constantly re-ordering the data can actually slow things down. That’s why Microsoft decided to disable it by default starting in early 2025.

So when should you use V-Ordering? I enable it on all my gold layer tables—the ones that Power BI reports read from. These tables are typically read-heavy and don’t change that often, so V-Ordering makes perfect sense. For bronze and silver tables that get frequent writes? Probably not worth it.

Checking If V-Ordering Is Enabled

The first thing you’ll want to do is check whether V-Ordering is enabled by default in your current Spark session. You can do this with a simple command in a Fabric notebook.

spark.conf.get("spark.sql.parquet.vorder.enabled")

If this returns false, then V-Ordering is not enabled by default. That’s the expected behavior for new workspaces created in 2025.

Checking V-Ordering configuration in notebook
Checking if V-Ordering is enabled by default

Enabling V-Ordering for Your Spark Session

If you want to enable V-Ordering by default for all tables you create in your current session, you can set the Spark configuration like this:

# Enable V-Ordering for the session
spark.conf.set("spark.sql.parquet.vorder.enabled", "true")

# Verify it's enabled
spark.conf.get("spark.sql.parquet.vorder.enabled")

This will return true, confirming that V-Ordering is now enabled. Any tables you create after setting this will be V-Ordered by default.

You can also disable it again if needed:

# Disable V-Ordering
spark.conf.set("spark.sql.parquet.vorder.enabled", "false")

# Verify it's disabled
spark.conf.get("spark.sql.parquet.vorder.enabled")

Creating a V-Ordered Table

Let’s create a simple table to see V-Ordering in action. First, I’ll create a table without V-Ordering enabled:

%%sql
CREATE TABLE dbo.customers (
    id INT,
    customer_name STRING
)

Now let’s check if this table has V-Ordering enabled by looking at its properties:

%%sql
SHOW TBLPROPERTIES dbo.customers

You won’t see any V-Ordering property listed, which means it’s not enabled for this table.

Creating a Table With V-Ordering Enabled

Now let’s create a new table with V-Ordering explicitly enabled using table properties:

%%sql
CREATE TABLE dbo.customers_vorder (
    id INT,
    customer_name STRING
)
TBLPROPERTIES ('delta.parquet.vorder.enabled' = 'true')

When we check the table properties for this new table:

%%sql
SHOW TBLPROPERTIES dbo.customers_vorder

We’ll now see delta.parquet.vorder.enabled = true in the output. Perfect! This table is V-Ordered.

Table properties showing V-Ordering enabled
Checking table properties to confirm V-Ordering is enabled

Enabling V-Ordering on Existing Tables

Here’s where things get a bit tricky. You’d think you could just run an ALTER TABLE command to enable V-Ordering on an existing table, right? Well, not quite.

According to the Microsoft documentation, you should be able to do this:

%%sql
ALTER TABLE dbo.customers 
SET TBLPROPERTIES ('delta.parquet.vorder.enabled' = 'true')

But when I tried this, I got an error. I’m not entirely sure why—it seems like a configuration issue with the Delta API or maybe a custom Microsoft Spark setting that’s not being recognized properly.

The workaround is to enable a specific Spark configuration first:

# Enable the setting that allows altering table properties
spark.conf.set("spark.databricks.delta.properties.defaults.vorder.enabled", "true")

After setting this configuration, the ALTER TABLE command should work:

%%sql
ALTER TABLE dbo.customers 
SET TBLPROPERTIES ('delta.parquet.vorder.enabled' = 'true')

Now when you check the table properties again, you’ll see that V-Ordering is enabled on the existing table.

I’m showing you all this struggling because when I was preparing this demo, I ran into the same issues. I could have edited all of this out and presented a clean solution, but then you wouldn’t see how to actually debug these kinds of problems. The struggling part is actually quite valuable, I think 🙂

When Should You Use V-Ordering?

So now you know how to enable V-Ordering, but when should you actually use it? Here’s my rule of thumb:

Enable V-Ordering for:

  • Gold layer tables that Power BI reports read from
  • Tables that are read-heavy and don’t change frequently
  • Any table backing a Direct Lake semantic model

Don’t enable V-Ordering for:

  • Bronze layer tables that get frequent incremental loads
  • Silver layer tables with high write volumes
  • Any table where write performance is more important than read performance

Remember, V-Ordering uses compute resources to organize your data. If you’re constantly writing to a table, you’re spending CUs to re-order data that might change again in a few minutes. That’s not a good use of your capacity.

If you want to learn more about managing your Fabric costs and CU consumption, check out my complete guide on Microsoft Fabric costs.

Quick Reference: V-Ordering Commands

Here’s a quick reference of all the commands we covered:

# Check if V-Ordering is enabled in your session
spark.conf.get("spark.sql.parquet.vorder.enabled")

# Enable V-Ordering for your session
spark.conf.set("spark.sql.parquet.vorder.enabled", "true")

# Disable V-Ordering for your session
spark.conf.set("spark.sql.parquet.vorder.enabled", "false")
-- Create a V-Ordered table
CREATE TABLE dbo.my_table (...)
TBLPROPERTIES ('delta.parquet.vorder.enabled' = 'true')

-- Check table properties
SHOW TBLPROPERTIES dbo.my_table

-- Enable V-Ordering on existing table (after setting the config above)
ALTER TABLE dbo.my_table 
SET TBLPROPERTIES ('delta.parquet.vorder.enabled' = 'true')

Wrapping Up

V-Ordering is a powerful optimization technique for read-heavy tables in Microsoft Fabric, especially when you’re using Power BI Direct Lake. Now you know how to check if it’s enabled, how to enable it for specific tables, and when you should (and shouldn’t) use it.

I promised this would be a short video, and it turned out a bit longer than expected. But hey, at least you got to see the debugging process and not just the polished final result!

Are you using V-Ordering in your Fabric lakehouses? Have you noticed performance improvements with Direct Lake? Let me know in the comments below!

Leave a Comment