A question we tend to get a lot when people first hear about Sail is: How does Sail compare to Spark accelerators like Databricks’ Photon, DataFusion Comet, and Velox? And why create an entirely new engine instead of contributing to the existing codebase?
To answer this, it’s important to first clarify what Spark accelerators like Photon, Comet, and Velox actually do.
How Spark Accelerators like Photon, Comet, and Velox Work
Spark accelerators such as Photon, Comet, and Velox (via Gluten) integrate with JVM-based Spark to replace portions of the physical execution layer with optimized native implementations. They often execute operators in native code and commonly use off-heap columnar data to reduce JVM GC pressure, while relying on Spark’s JVM-based control plane for planning and orchestration. This hybrid architecture creates a strict boundary between native operator execution and Spark’s JVM-level runtime. Consequently, executing custom code typically requires crossing back into JVM or Python execution contexts (often involving data serialization, format conversions, or other handoffs), which helps explain why Photon does not support Python UDFs, while Sail supports them natively.
In fact, Databricks’ documentation on Photon lists several additional limitations:
- Photon doesn’t support UDFs, RDD APIs, or Dataset APIs.
- Stateful streaming is not supported. Photon supports stateless streaming only.
- Photon doesn’t improve queries that normally run in under two seconds.
Databricks, “What is Photon?” Databricks Documentation, accessed May 28, 2026.
Why Sail
Spark was designed 17 years ago. Its foundations, a row-based internal data representation, JVM-based execution, and an architecture that predates the decoupling of storage and compute, made sense for the Hadoop era. They are now the constraints that limit what the system can do, especially for AI workloads.
To build the engine we set out to build, the JVM had to be eliminated. Not optimized around, not supplemented with native accelerators. Eliminated.
The JVM imposes constraints that propagate through every layer of a query engine: garbage collection pauses, object allocation overhead, Python interoperability through Py4J serialization, and heavy container footprints that limit cloud elasticity. Spark accelerators can speed up individual operators, but they cannot remove these constraints. They still run inside Spark’s JVM executors. The JVM remains the bottleneck.
Sail removes it entirely. Planning and execution run in a Rust-native query engine built on Apache Arrow’s columnar memory model and Apache DataFusion’s execution framework. Workers exchange Arrow batches directly using Arrow Flight rather than JVM-based shuffle. Python UDFs run in-process via PyO3 with zero-copy Arrow data sharing. Memory management relies on Rust’s compile-time ownership guarantees rather than JVM garbage collection. The process starts in seconds and consumes only tens of megabytes when idle.
This is also why Sail can serve as a unified engine rather than a specialized tool. JVM-based engines handle Python and AI/ML integration poorly, which forces organizations to maintain separate systems for data processing and AI workloads. Sail’s native Python support and Arrow-based memory model make it possible to run both in the same engine, without the serialization overhead that keeps these workloads apart.
Why Spark Compatibility
Upstreaming any of this to Spark would mean replacing its shuffle protocol, executor lifecycle, memory management assumptions, and Python bridge. These are components that every Spark connector, extension, and workload depends on. At that point, that is not a contribution to Spark, it is writing a whole different engine.
But Spark’s API is the lingua franca of distributed data processing. Millions of engineers know PySpark’s DataFrame and SQL interfaces. Rewriting an engine shouldn’t require rewriting every application that runs on it.
As a result, we decided that Sail should implement the Spark Connect protocol in Rust, giving users the same DataFrame and SQL APIs they already rely on. The interfaces stay unchanged. Underneath, execution runs on an entirely different architecture built for columnar processing, native Python interoperability, and elastic infrastructure.
No Spark. No JVM. But your Spark workloads run as is, all on a Rust-native runtime.
Benchmark Results
These architectural differences have proven to be significantly more performant. In the ClickBench benchmark, Sail outperforms every Spark + Spark accelerator configuration (Auron, Comet, Gluten-on-Velox) across all instance sizes (May 29, 2026).
Sail (Parquet) (c8g.metal-48xl) 2026-05-11 ×2.01
View raw timings on GitHub →Hot median 282msLoad time 7sData size 13.8 GBCold / hot 3.8× fasterSail (Parquet) (c8g.4xlarge) 2026-05-11 ×2.01
View raw timings on GitHub →Hot median 468msLoad time 2sData size 13.8 GBCold / hot 4.8× fasterSnowflake (64×3XL) 2022-07-01 ×2.61
View raw timings on GitHub →Hot median 296msLoad time 42m 4sData size 11.5 GBCold / hot 1.4× fasterSnowflake (32×2XL) 2022-07-01 ×2.68
View raw timings on GitHub →Hot median 302msLoad time 42m 4sData size 11.5 GBCold / hot 1.4× fasterSail (Parquet) (c6a.4xlarge) 2026-05-11 ×2.68
View raw timings on GitHub →Hot median 825msLoad time 2sData size 13.8 GBCold / hot 3.2× fasterDatabricks (32×XL) 2025-11-13 ×2.78
View raw timings on GitHub →Hot median 503msLoad time 41sData size 9.5 GBCold / hot 1.3× fasterSail (Parquet) (c7a.metal-48xl) 2026-05-11 ×2.81
View raw timings on GitHub →Hot median 580msLoad time 1sData size 13.8 GBCold / hot 3.3× fasterSnowflake (128×4XL) 2022-07-01 ×2.86
View raw timings on GitHub →Hot median 322msLoad time 42m 4sData size 11.5 GBCold / hot 1.6× fasterDatabricks (64×2XL) 2025-11-13 ×2.96
View raw timings on GitHub →Hot median 575msLoad time 36sData size 9.5 GBCold / hot 1.4× fasterDatabricks (16×L) 2025-11-13 ×2.97
View raw timings on GitHub →Hot median 546msLoad time 45sData size 9.5 GBCold / hot 1.3× fasterSail (Parquet) (c6a.metal) 2026-05-11 ×2.99
View raw timings on GitHub →Hot median 607msLoad time 6sData size 13.8 GBCold / hot 3.0× fasterDatabricks (256×4XL) 2025-11-13 ×3.02
View raw timings on GitHub →Hot median 559msLoad time 30sData size 9.5 GBCold / hot 1.4× fasterSnowflake (16×XL) 2022-07-01 ×3.04
View raw timings on GitHub →Hot median 366msLoad time 42m 4sData size 11.5 GBCold / hot 1.4× fasterDatabricks (8×M) 2025-11-13 ×3.15
View raw timings on GitHub →Hot median 579msLoad time 53sData size 9.5 GBCold / hot 1.3× fasterSail (Parquet) (c6a.2xlarge) 2026-05-11 ×3.35
View raw timings on GitHub →Hot median 1.37sLoad time 4sData size 13.8 GBCold / hot 2.7× fasterSnowflake (8×L) 2022-07-01 ×3.80
View raw timings on GitHub →Hot median 537msLoad time 42m 4sData size 11.5 GBCold / hot 1.4× fasterDatabricks (4×S) 2025-11-13 ×3.82
View raw timings on GitHub →Hot median 731msLoad time 1m 7sData size 9.5 GBCold / hot 1.3× fasterSail (Parquet) (c6a.xlarge) 2026-05-11 ×4.78
View raw timings on GitHub →Hot median 2.40sLoad time 1sData size 13.8 GBCold / hot 2.2× fasterSnowflake (4×M) 2022-07-01 ×4.78
View raw timings on GitHub →Hot median 830msLoad time 42m 4sData size 11.5 GBCold / hot 1.3× fasterDatabricks (2×XS) 2025-11-13 ×4.86
View raw timings on GitHub →Hot median 972msLoad time 1m 31sData size 9.5 GBCold / hot 1.3× fasterDatabricks (2XS) 2025-11-10 ×5.07
View raw timings on GitHub →Hot median 1.09sLoad time 1m 30sData size 9.5 GBCold / hot 1.2× fasterSnowflake (2×S) 2022-07-01 ×6.19
View raw timings on GitHub →Hot median 1.35sLoad time 42m 4sData size 11.5 GBCold / hot 1.2× fasterSail (Parquet) (c6a.large) 2026-05-11 ×8.27
View raw timings on GitHub →Hot median 4.59sLoad time Not measuredData size 13.8 GBCold / hot 2.0× fasterSnowflake (XS) 2022-07-01 ×8.41
View raw timings on GitHub →Hot median 2.04sLoad time 42m 4sData size 11.5 GBCold / hot 1.2× fasterSpark (c8g.4xlarge) 2026-05-11 ×13.08
View raw timings on GitHub →Hot median 4.70sLoad time 1sData size 13.8 GBCold / hot 1.2× fasterSpark (Comet) (c8g.4xlarge) 2026-05-11 ×13.63
View raw timings on GitHub →Hot median 4.04sLoad time 10sData size 13.8 GBCold / hot 1.5× fasterSpark (Gluten-on-Velox) (c6a.4xlarge) 2026-05-11 ×14.37
View raw timings on GitHub →Hot median 4.64sLoad time 11sData size 13.8 GBCold / hot 1.4× fasterSpark (Auron) (c6a.4xlarge) 2026-05-11 ×14.49
View raw timings on GitHub →Hot median 4.71sLoad time Not measuredData size 13.8 GBCold / hot 1.3× fasterSail (Parquet) (t3a.small) 2026-05-11 ×15.26
View raw timings on GitHub →Hot median 8.80sLoad time Not measuredData size 13.8 GBCold / hot 1.6× fasterSpark (Gluten-on-Velox) (c7a.metal-48xl) 2026-05-11 ×15.51
View raw timings on GitHub →Hot median 5.26sLoad time 3sData size 13.8 GBCold / hot 1.4× fasterSpark (Comet) (c8g.metal-48xl) 2026-05-11 ×16.00
View raw timings on GitHub →Hot median 5.48sLoad time Not measuredData size 13.8 GBCold / hot 1.4× fasterSpark (c6a.4xlarge) 2026-05-11 ×16.45
View raw timings on GitHub →Hot median 6.54sLoad time Not measuredData size 13.8 GBCold / hot 1.2× fasterSpark (Gluten-on-Velox) (c6a.metal) 2026-05-11 ×16.63
View raw timings on GitHub →Hot median 5.97sLoad time 5sData size 13.8 GBCold / hot 1.3× fasterSpark (c7a.metal-48xl) 2026-05-11 ×16.95
View raw timings on GitHub →Hot median 7.17sLoad time 3sData size 13.8 GBCold / hot 1.4× fasterSpark (c8g.metal-48xl) 2026-05-11 ×17.02
View raw timings on GitHub →Hot median 6.39sLoad time 3sData size 13.8 GBCold / hot 1.5× fasterSpark (c6a.metal) 2026-05-11 ×17.03
View raw timings on GitHub →Hot median 6.74sLoad time Not measuredData size 13.8 GBCold / hot 1.3× fasterSpark (Gluten-on-Velox) (c6a.2xlarge) 2026-05-11 ×17.08
View raw timings on GitHub →Hot median 6.19sLoad time 4sData size 13.8 GBCold / hot 1.2× fasterSpark (Comet) (c7a.metal-48xl) 2026-05-11 ×17.24
View raw timings on GitHub →Hot median 6.09sLoad time 3sData size 13.8 GBCold / hot 1.4× fasterSpark (Comet) (c6a.metal) 2026-05-11 ×17.57
View raw timings on GitHub →Hot median 6.55sLoad time 5sData size 13.8 GBCold / hot 1.3× fasterSpark (Comet) (c6a.4xlarge) 2026-05-11 ×18.25
View raw timings on GitHub →Hot median 5.95sLoad time 10sData size 13.8 GBCold / hot 1.3× fasterSpark (Auron) (c6a.2xlarge) 2026-05-11 ×18.39
View raw timings on GitHub →Hot median 6.31sLoad time 4sData size 13.8 GBCold / hot 1.1× fasterSpark (c6a.2xlarge) 2026-05-11 ×21.22
View raw timings on GitHub →Hot median 9.05sLoad time 4sData size 13.8 GBCold / hot similarSpark (Comet) (c6a.2xlarge) 2026-05-11 ×23.00
View raw timings on GitHub →Hot median 8.43sLoad time 4sData size 13.8 GBCold / hot 1.2× fasterSpark (Gluten-on-Velox) (c6a.xlarge) 2026-05-11 ×24.40
View raw timings on GitHub →Hot median 9.93sLoad time 1sData size 13.8 GBCold / hot 1.1× fasterSpark (Auron) (c6a.xlarge) 2026-05-11 ×26.38
View raw timings on GitHub →Hot median 11.21sLoad time 1sData size 13.8 GBCold / hot similarSpark (c6a.xlarge) 2026-05-11 ×30.43
View raw timings on GitHub →Hot median 14.51sLoad time 1sData size 13.8 GBCold / hot similarSpark (Comet) (c6a.xlarge) 2026-05-11 ×33.25
View raw timings on GitHub →Hot median 14.08sLoad time 1sData size 13.8 GBCold / hot similarSpark (Gluten-on-Velox) (c6a.large) 2026-05-11 ×38.41
View raw timings on GitHub →Hot median 18.35sLoad time Not measuredData size 13.8 GBCold / hot similarSpark (Auron) (c6a.large) 2026-05-11 ×42.94
View raw timings on GitHub →Hot median 19.71sLoad time Not measuredData size 13.8 GBCold / hot similarSpark (c6a.large) 2026-05-11 ×49.81
View raw timings on GitHub →Hot median 27.86sLoad time Not measuredData size 13.8 GBCold / hot similarSpark (Comet) (c6a.large) 2026-05-11 ×54.35
View raw timings on GitHub →Hot median 25.86sLoad time Not measuredData size 13.8 GBCold / hot similarSpark (Gluten-on-Velox) (t3a.small) 2026-05-11 ×67.44
View raw timings on GitHub →Hot median 32.26sLoad time Not measuredData size 13.8 GBCold / hot similarSpark (Auron) (c6a.metal) 2026-05-11 ×82.84
View raw timings on GitHub →Hot median 40.29sLoad time Not measuredData size 13.8 GBCold / hot similarSpark (Auron) (c7a.metal-48xl) 2026-05-11 ×84.59
View raw timings on GitHub →Hot median 42.07sLoad time Not measuredData size 13.8 GBCold / hot similar
Additionally, the results show that Sail outperforms Databricks’ and Snowflake’s own proprietary engines on significantly less hardware, not just Spark and Spark accelerators.
Getting Started
Getting started with Sail is simple. Head over to our deployment guide for a step-by-step guide on installing, configuring, and running Sail with PySpark.
Want to run Sail with managed infrastructure? LakeSail is launching a fully managed platform with built-in governance, observability, BYOC deployment, and enterprise controls. Get early access to see how Sail can improve performance and reduce costs for your team.