For Delta Lake operations on Azure Databricks or Microsoft Fabric, we have an advanced optimization technique called V-Ordering, which involves contrasting data organization strategies with file encoding optimization, determining how data is sorted and compressed within each file.
V-Order is a write-time optimization for Parquet files, originally developed by Microsoft and tightly integrated with Microsoft Fabric. It’s an optimization that logically organizes data based on the same storage algorithm used in Power BI’s VertiPaq engine. It reorganizes the internal layout of Parquet row groups — applying special sorting, row group distribution, dictionary encoding, and compression — to accelerate read performance across analytics engines.
The key insight: Parquet’s on-disk layout gets reshaped to closely match the VertiPaq in-memory columnar format used by Power BI and SQL Server. Because the layout aligns so well with how the engine wants to consume it, reads approach “in-memory-like” data access times.
Importantly, V-Order is 100% Parquet-compliant — any Parquet reader (open-source Spark, DuckDB, Polars, Databricks, etc.) can read V-Ordered files as regular Parquet. They’re just better-organized regular Parquet files.
The performance gains from V-ordering really depend on the engine and workload. On average, V-ordered files deliver around 10% faster read times, and in some special cases that can climb as high as 50%. That said, there’s a trade-off — V-ordering adds a sorting step during writes, which can bump up average write times by up to 15%. The good news is, you can disable it if needed.
Delta Tables and V-Ordering
Delta Tables and V-Ordering operate at different layers of the storage stack: Delta Lake defines the table format, while V-Ordering is an engine-level optimization technique for standard Parquet files.
Core Differences:
| Feature | Delta Table | V-Ordering |
|---|---|---|
| Category | Open Storage Format | Write Optimization Algorithm |
| Layer | Table Level (Data + Transaction Log) | File/Layout Level (Parquet internal structure) |
| Primary Goal | ACID transactions, time travel, schema enforcement | Faster read performance in compute engines (e.g., Microsoft Fabric VertiPaq engine) |
| Standards | Open source (Delta Lake / Linux Foundation) | Proprietary / Engine-specific (Originated in Power BI/Fabric VertiPaq) |
| Mechanism | Standard Parquet data files managed by _delta_log/ JSON commits |
In-memory sorting, row-group clustering, and dictionary encoding optimization |
How They Work Together
- Delta Tables organize raw data into standard Parquet files alongside a
_delta_logdirectory that tracks state and metadata. - V-Ordering is applied during the write phase of a Delta table. It rearranges data inside individual Parquet files to maximize compression and speed up vectorization during query processing.
- Because V-Ordered files remain valid, fully compliant Parquet files, applying V-Ordering to a Delta table does not break open compatibility with engines like Apache Spark, Databricks, or Trino—they can still read the files normally, while supported engines read them significantly faster.
How V-Order Works
At a physical level, V-Order does several things to Parquet row groups:
- Vertical (columnar) sorting within each row group — increases value locality (similar values sit next to similar values), which dramatically improves Run-Length Encoding (RLE).
- Optimized dictionary ordering — better encoding ratios for low-cardinality columns.
- Improved row group distribution — uniform sizes that match VertiPaq segment expectations.
- Microsoft-proprietary compression on top of standard Parquet encodings (dictionary, RLE, delta).
The result: data is much more compressible, and query engines can compute results directly on top of compressed data, skipping the decompression step.
Should You Use It?
Whether V-ordering is worth using really depends on your architecture and how you’re using the data. If your workloads lean heavily on SQL endpoints, for instance, it’s worth aligning V-ordering with those layers specifically. Weigh the performance gains it offers against any potential slowdown elsewhere before deciding.
Medallion Architecture Recommendations
| Layer | Enable V-Order? | Reasoning |
|---|---|---|
| Bronze | No | Raw data, written once, rarely read. Optimization adds no value. |
| Silver | Maybe | Mixed reads/writes. Enable if downstream consumers query it heavily. |
| Gold | Yes | Heavily read for analytics/reporting. Big payoff. |
When V-Order Might NOT Be Right
- Write-intensive staging warehouses: On tables that get dropped/recreated frequently may not justify the write overhead. (In Fabric Warehouse, disabling V-Order is a one-way, irreversible operation.)
- Full-table scans: V-Order helps most when queries touch specific columns. Full scans see smaller gains.
- Bronze/landing layers: As above.
Direct Lake Optimization Checklist
If you’re using Direct Lake on top of V-Order:
- Apply V-Order on source tables
- Target row group size: 1M–16M rows per group
- Use append-only ingestion patterns when possible (preserves incremental framing)
- Avoid
OVERWRITEon large tables (forces cold reload) - Use partitioning with low-cardinality columns (<200 distinct values) for large rolling-window tables
- Run
OPTIMIZEperiodically — but not so often it cancels incremental framing benefits - Check
DISCOVER_STORAGE_TABLE_COLUMN_SEGMENTSto monitor segment health
How to Configure V-Order
In Fabric Spark, V-Order behavior is controlled at three levels (lower levels override higher):
- Session-level (Spark conf):
spark.conf.set("spark.sql.parquet.vorder.default", "true") # enable
spark.conf.set("spark.sql.parquet.vorder.default", "false") # disable
- Table-level (TBLPROPERTIES):
You can configure V-order using Delta table properties.
CREATE TABLE person (id INT, name STRING, age INT)
USING parquet
TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");
ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");
- Write-level (DataFrame writer option):
df.write.format("delta") \
.mode("overwrite") \
.option("parquet.vorder.enabled", "true") \
.saveAsTable("myschema.mytable")
You can also apply V-Order to existing tables via:
OPTIMIZE my_table VORDER;
OPTIMIZE my_table WHERE date >= '2025-01-01' VORDER;
Default behavior: V-Order is disabled by default in newly created Fabric workspaces to optimize performance for write-heavy data engineering workloads. You must opt in.
There are three approaches to checking if a table is V-Ordered:
- Lakehouse UI: Right-click table → View Files →
_delta_log→ inspect latest.jsonfor thevorderproperty. - Spark SQL:
SHOW TBLPROPERTIES my_table; - PyArrow metadata check (programmatic):
import pyarrow.dataset as ds schema = ds.dataset(table_path).schema.metadata is_vorder = any(b'vorder' in key for key in schema.keys())
V-Order Interactions With Tools and Platforms
Databricks
V-Ordering is only supported when Databricks runs on Azure, because Azure Databricks is built on a Microsoft-owned runtime that natively supports the feature. On AWS or GCP, the underlying engine doesn’t include V-Ordering, so it’s not available regardless of cluster configuration.
So if you’re on Azure Databricks, you can enable V-Ordering directly on your Spark tables — and that’s the most common path for feeding data into Microsoft Fabric OneLake or a Fabric Spark job.
Databricks running on GCP or AWS does not support V-Ordering, nor can you set it natively within standard Databricks clusters on any cloud. If your data pipeline requires V-Ordering (e.g., to feed Microsoft Fabric directly from Databricks storage in AWS S3 or GCP GCS), you would need to process or write that data using a Microsoft Fabric Spark job or engine rather than a standard Databricks runtime.
The Direct Lake Connection in Power BI
Direct Lake mode in Power BI is V-Order’s killer use case. VertiPaq reads V-Ordered column segments directly from OneLake into its in-memory cache with minimal transformation. Without V-Order, VertiPaq must decode and re-encode column data to match its internal format — a CPU-intensive step that delays query response.
With V-Order:
- Sub-second query performance on tables with billions of rows
- Faster cold-start times
- Reduced memory pressure
- Incremental framing works much better — VertiScan caches stay warm, and queries hit caches
How Third-Party Platforms Interact with V-Order
Because V-Order formats the underlying data as open-source Parquet files, third-party platforms run seamlessly without compatibility blocks.
External BI tools like Tableau and Qlik can connect to and query V-Ordered data, but the level of benefit depends heavily on how they access the files.
The performance benefits vary depending on the data architecture strategy used:
- SQL Analytics Endpoint Queries (High Benefit):
If you connect Tableau or Qlik to a Microsoft Fabric Lakehouse or Warehouse using native SQL connection strings:
- The Tools: Tableau/Qlik act as the reporting layer, pulling data from Microsoft’s compute engines via standard TDS/SQL protocols.
- The Benefit: Microsoft’s specialized Verti-Scan engines process the V-Ordered files instantly behind the scenes.
- The Result: Your dashboards gain maximum query speeds, as the heavy optimization lifting is done directly at the server level.
- Direct File / Lakehouse Storage Queries (Moderate Benefit):
If you configure Tableau or Qlik to query data lakes directly (e.g., Azure Data Lake Storage Gen2, AWS S3) via open-source engines like standard Apache Spark, Presto, or Trino:
- The Tools: Tableau/Qlik send queries through the external engine.
- The Benefit: The query engine benefits from V-Order’s optimized sorting, dictionary encoding, and high compression.
- The Result: The BI tools experience 10% to 40% faster dashboard load times because the underlying engine scans significantly less data on disk.
- In-Memory Import / Extracts (Minimal Benefit):
If you completely import data into Tableau extracts (.hyper) or Qlik’s in-memory storage (.qvd):
- The Tools: Data is completely copied into the BI platform’s proprietary formatting.
- The Benefit: V-Order only helps speed up the initial data extraction pipeline.
- The Result: Once the data is imported, Tableau and Qlik rely on their own engine performance, completely bypassing V-Order.
Performance Comparison for BI Tools
| Feature | Power BI (Direct Lake) | Others (Live via Fabric SQL) | Others (via Open Spark/Trino) | Others (In-Memory Extracts) |
|---|---|---|---|---|
| Compatibility | Native | Supported | Supported | Supported |
| Read Speed Boost | Up to 50% faster | Up to 50% faster | 10% – 40% faster | 0% (Only impacts extraction time) |
| Underlying Tech | Verti-Scan | Verti-Scan | Standard Parquet Reader | Tool’s internal engine (.hyper/.qvd) |
Where Microsoft Has the Advantage
- Deep Engine Integration: While others can read the files, Microsoft’s proprietary engines (like Power BI and SQL in Microsoft Fabric) use specialized Verti-Scan technology that interacts directly with V-Order structures to achieve near in-memory access speeds.
- Native Writing: V-Order is natively built into the write paths of Microsoft Fabric services, whereas external tools would need custom configurations to write data using the same formatting rules.
How Others Benefit
- Universal Compatibility: Any third-party tool or non-Microsoft engine (like standard Apache Spark, Databricks, or Python/Pandas tools) can open and read V-Ordered files just like regular Parquet data.
- Read Performance Boost: Because V-Order applies specialized sorting, dictionary encoding, and high-level compression, non-Microsoft engines still experience an average of 10% faster read times (and up to 50% faster in certain queries) due to reduced disk and CPU overhead.
Optimization Strategies Comparison
Comparing Partitioning + Z-Ordering, Liquid Clustering, and V-Ordering comes down to contrasting data organization strategies against a file encoding optimization.
Partitioning, Z-Ordering, and Liquid Clustering determine which rows are grouped into which files, whereas V-Ordering determines how data is sorted and compressed inside each file. Then V-Ordering is complementary, not competing with the other optimizations.
| Feature | Partitioning + Z-Ordering | Liquid Clustering | V-Ordering |
|---|---|---|---|
| Primary Category | Physical Data Layout | Next-Gen Physical Data Layout | File-Level Sorting & Encoding |
| Origin / Ecosystem | Open Delta Lake / Databricks | Databricks (Delta Lake native) | Microsoft Fabric (VertiPaq technology) |
| Scope | Directory hierarchy + File clustering | Dynamic file clustering (No subdirectories) | Internal Parquet row group layout |
| Target | Data skipping on specific filters | Data skipping on flexible/evolving filter patterns | Compression & general read performance |
| When applied | During OPTIMIZE (explicit) |
During write (incremental) or OPTIMIZE |
During write (automatic) |
| Write Cost | High (Requires fixed partition keys & manual OPTIMIZE ZORDER) |
Low / Incremental (Clustering applied write-time or during light maintenance) | Moderate (Sorts and compresses data during write) |
| Data Skew Handling | Poor (Requires carefully picking high-cardinality vs low-cardinality keys) | Excellent (Handles high-cardinality keys and evolving patterns automatically) | N/A (Operates per file regardless of global partitioning) |
| Compatibility | Fully open source standard | Delta Lake 3.0+ / Databricks runtime | Standard Parquet compliant (Reads everywhere, fast on Fabric) |
| Maintenance | Manual, periodic | Automatic/incremental | Automatic per write |
| Best for | Known filter patterns | Evolving access patterns, high-cardinality columns | General workloads, Direct Lake |
Detailed Breakdown:
- Partitioning + Z-Ordering (The Legacy Standard)**:
- Partitioning divides data into strict physical subdirectories based on specific low-cardinality columns (e.g.,
Year/Month). - Z-Ordering is a manual optimization process (
OPTIMIZE ... ZORDER BY) applied to high-cardinality columns within those partitions to map multi-dimensional data onto 1D spaces (space-filling curve) for efficient file skipping. - Limitations: Partition keys must be chosen upfront and cannot be changed easily. Small files easily accumulate if over-partitioned, and running Z-Order is computationally expensive across large volumes.
- Liquid Clustering (The Modern Delta Standard)**:
- Replaces static hive-style partitioning and Z-Ordering with a fully dynamic, self-tuning data layout model.
- Dynamic Flexibility: You can define clustering keys on any high-cardinality or low-cardinality column without creating physical subdirectories. Clustering keys can be updated on the fly without rewriting historical data.
- Incremental Optimization: Data is incrementally clustered at write time, eliminating the massive compute overhead of traditional Z-Ordering while maintaining consistent query pruning performance.
- V-Ordering (The Microsoft Fabric Reader Optimization):
- Unlike the previous two techniques, V-Ordering does not replace Delta partitioning or clustering algorithms—it works alongside them inside individual Parquet data files.
- Mechanism: It reorders row groups and applies advanced dictionary encoding at the Parquet layer, optimized for fast in-memory scans by columnar analytics engines (like Power BI Direct Lake mode and Fabric SQL engines).
- Interoperability: Because the output is standard Parquet, a Delta Table written with V-Ordering can still be read by Databricks, Spark, or Trino, but Microsoft Fabric engines gain maximum vectorization and memory efficiency.
Conclusion
So, putting it all together — V-Order is basically Parquet that’s been pre-arranged to play nicely with VertiPaq and modern columnar engines. You pay a small ~15% cost on the write side once, and you get meaningful read-time savings on every query after that. For Direct Lake scenarios in Fabric, it’s essentially mandatory. And for broader Delta workloads on Fabric, it’s a strong default — especially in the Silver and Gold layers where reads dominate.
The best part? Because the output stays standard Parquet, you don’t give up portability or open-format compliance to get the speedup. Any engine that reads regular Parquet can read V-Ordered files — they just go noticeably faster, especially when Microsoft’s Verti-Scan is doing the reading.
As for how it stacks up against other strategies — here’s how I’d think about it: use Liquid Clustering on Databricks or Delta Lake for new workloads, since it replaces the old static PARTITION BY and Z-ORDER setup with something far more flexible. Use V-Ordering when your Delta workloads run in or feed into Microsoft Fabric, particularly for Direct Lake. And if you can combine the two — V-Ordering on top of Liquid Clustering — you get the best of both worlds: smart file-level skipping plus optimized scan efficiency inside each file.
And if V-Order is on the table but Liquid Clustering isn’t an option? Use V-Order as the baseline, and layer Z-Order on top for tables with known, high-cardinality filter columns.
Where Microsoft really wins is in the engine integration. While anyone can read V-Ordered files, Microsoft’s Fabric and Power BI engines talk to those structures natively — pushing performance close to in-memory speeds. External tools get the universal compatibility and a solid 10–50% read boost, but the killer experience still lives inside the Microsoft ecosystem.
Sources
- MS Fabric Learn – V-Order: https://learn.microsoft.com/en-us/fabric/data-warehouse/v-order
- MS Fabric Community General Discussion – V-Order map Z-Order: https://community.fabric.microsoft.com/t5/General-Discussion/V-Order-amp-Z-Order/m-p/3750690/highlight/true
- MS Fabric Learn – Delta Optimization and V-Order: https://learn.microsoft.com/pt-br/fabric/data-engineering/delta-optimization-and-v-order
- Fabric Lakehouse & Warehouse: Is V‑Order Enabled by Default? https://www.youtube.com/watch?v=bItop7_q7zU&t=18
- MS Fabric Learn – Delta Optimization and V-Order: https://learn.microsoft.com/pt-br/fabric/data-engineering/delta-optimization-and-v-order
- MS Fabric Community General-Discussion – V-Order & Z-Order: https://community.fabric.microsoft.com/discussions/ac_generaldiscussion/v-order–z-order/3750416
- What is V-Order in Microsoft Fabric … and why you should care! https://www.linkedin.com/pulse/what-v-order-microsoft-fabric-why-should-you-care-jacob-rønnow-jensen
- MS Fabric Community Blog – Unlock the power of V-Order: Revolutionize Data Read times and storage efficiency: (https://community.fabric.microsoft.com/t5/Data-Engineering-Community-Blog/Unlock-the-power-of-V-Order-Revolutionize-Data-Read-times-and/ba-p/4674407)
- Building Medallion Architectures – Designing with Delta Lake and Spark: https://www.oreilly.com/library/view/building-medallion-architectures/9781098178826/
Deixar um comentário