Engineering

How Sail Compares to Photon and Other Spark Accelerators

Why building Sail meant rebuilding Spark, not accelerating it. The JVM bottleneck and the case for a clean-slate Rust runtime.

4 min read May 2026

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).

ClickBench — Sail vs Spark + accelerators Source: benchmark.clickhouse.com · combined metric, lower is better · captured 2026-05-29
  1. Sail (Parquet) (c8g.metal-48xl) 2026-05-11 ×2.01
    Hot median 282ms
    Load time 7s
    Data size 13.8 GB
    Cold / hot 3.8× faster
    Tags column-oriented, stateless
    View raw timings on GitHub →
  2. Sail (Parquet) (c8g.4xlarge) 2026-05-11 ×2.01
    Hot median 468ms
    Load time 2s
    Data size 13.8 GB
    Cold / hot 4.8× faster
    Tags column-oriented, stateless
    View raw timings on GitHub →
  3. Snowflake (64×3XL) 2022-07-01 ×2.61
    Hot median 296ms
    Load time 42m 4s
    Data size 11.5 GB
    Cold / hot 1.4× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  4. Snowflake (32×2XL) 2022-07-01 ×2.68
    Hot median 302ms
    Load time 42m 4s
    Data size 11.5 GB
    Cold / hot 1.4× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  5. Sail (Parquet) (c6a.4xlarge) 2026-05-11 ×2.68
    Hot median 825ms
    Load time 2s
    Data size 13.8 GB
    Cold / hot 3.2× faster
    Tags column-oriented, stateless
    View raw timings on GitHub →
  6. Databricks (32×XL) 2025-11-13 ×2.78
    Hot median 503ms
    Load time 41s
    Data size 9.5 GB
    Cold / hot 1.3× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  7. Sail (Parquet) (c7a.metal-48xl) 2026-05-11 ×2.81
    Hot median 580ms
    Load time 1s
    Data size 13.8 GB
    Cold / hot 3.3× faster
    Tags column-oriented, stateless
    View raw timings on GitHub →
  8. Snowflake (128×4XL) 2022-07-01 ×2.86
    Hot median 322ms
    Load time 42m 4s
    Data size 11.5 GB
    Cold / hot 1.6× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  9. Databricks (64×2XL) 2025-11-13 ×2.96
    Hot median 575ms
    Load time 36s
    Data size 9.5 GB
    Cold / hot 1.4× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  10. Databricks (16×L) 2025-11-13 ×2.97
    Hot median 546ms
    Load time 45s
    Data size 9.5 GB
    Cold / hot 1.3× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  11. Sail (Parquet) (c6a.metal) 2026-05-11 ×2.99
    Hot median 607ms
    Load time 6s
    Data size 13.8 GB
    Cold / hot 3.0× faster
    Tags column-oriented, stateless
    View raw timings on GitHub →
  12. Databricks (256×4XL) 2025-11-13 ×3.02
    Hot median 559ms
    Load time 30s
    Data size 9.5 GB
    Cold / hot 1.4× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  13. Snowflake (16×XL) 2022-07-01 ×3.04
    Hot median 366ms
    Load time 42m 4s
    Data size 11.5 GB
    Cold / hot 1.4× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  14. Databricks (8×M) 2025-11-13 ×3.15
    Hot median 579ms
    Load time 53s
    Data size 9.5 GB
    Cold / hot 1.3× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  15. Sail (Parquet) (c6a.2xlarge) 2026-05-11 ×3.35
    Hot median 1.37s
    Load time 4s
    Data size 13.8 GB
    Cold / hot 2.7× faster
    Tags column-oriented, stateless
    View raw timings on GitHub →
  16. Snowflake (8×L) 2022-07-01 ×3.80
    Hot median 537ms
    Load time 42m 4s
    Data size 11.5 GB
    Cold / hot 1.4× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  17. Databricks (4×S) 2025-11-13 ×3.82
    Hot median 731ms
    Load time 1m 7s
    Data size 9.5 GB
    Cold / hot 1.3× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  18. Sail (Parquet) (c6a.xlarge) 2026-05-11 ×4.78
    Hot median 2.40s
    Load time 1s
    Data size 13.8 GB
    Cold / hot 2.2× faster
    Tags column-oriented, stateless
    View raw timings on GitHub →
  19. Snowflake (4×M) 2022-07-01 ×4.78
    Hot median 830ms
    Load time 42m 4s
    Data size 11.5 GB
    Cold / hot 1.3× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  20. Databricks (2×XS) 2025-11-13 ×4.86
    Hot median 972ms
    Load time 1m 31s
    Data size 9.5 GB
    Cold / hot 1.3× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  21. Databricks (2XS) 2025-11-10 ×5.07
    Hot median 1.09s
    Load time 1m 30s
    Data size 9.5 GB
    Cold / hot 1.2× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  22. Snowflake (2×S) 2022-07-01 ×6.19
    Hot median 1.35s
    Load time 42m 4s
    Data size 11.5 GB
    Cold / hot 1.2× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  23. Sail (Parquet) (c6a.large) 2026-05-11 ×8.27
    Hot median 4.59s
    Load time Not measured
    Data size 13.8 GB
    Cold / hot 2.0× faster
    Tags column-oriented, stateless
    View raw timings on GitHub →
  24. Snowflake (XS) 2022-07-01 ×8.41
    Hot median 2.04s
    Load time 42m 4s
    Data size 11.5 GB
    Cold / hot 1.2× faster
    Tags column-oriented, managed
    View raw timings on GitHub →
  25. Spark (c8g.4xlarge) 2026-05-11 ×13.08
    Hot median 4.70s
    Load time 1s
    Data size 13.8 GB
    Cold / hot 1.2× faster
    Tags column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  26. Spark (Comet) (c8g.4xlarge) 2026-05-11 ×13.63
    Hot median 4.04s
    Load time 10s
    Data size 13.8 GB
    Cold / hot 1.5× faster
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →
  27. Spark (Gluten-on-Velox) (c6a.4xlarge) 2026-05-11 ×14.37
    Hot median 4.64s
    Load time 11s
    Data size 13.8 GB
    Cold / hot 1.4× faster
    Tags C++, column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  28. Spark (Auron) (c6a.4xlarge) 2026-05-11 ×14.49
    Hot median 4.71s
    Load time Not measured
    Data size 13.8 GB
    Cold / hot 1.3× faster
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →
  29. Sail (Parquet) (t3a.small) 2026-05-11 ×15.26
    Hot median 8.80s
    Load time Not measured
    Data size 13.8 GB
    Cold / hot 1.6× faster
    Tags column-oriented, stateless
    View raw timings on GitHub →
  30. Spark (Gluten-on-Velox) (c7a.metal-48xl) 2026-05-11 ×15.51
    Hot median 5.26s
    Load time 3s
    Data size 13.8 GB
    Cold / hot 1.4× faster
    Tags C++, column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  31. Spark (Comet) (c8g.metal-48xl) 2026-05-11 ×16.00
    Hot median 5.48s
    Load time Not measured
    Data size 13.8 GB
    Cold / hot 1.4× faster
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →
  32. Spark (c6a.4xlarge) 2026-05-11 ×16.45
    Hot median 6.54s
    Load time Not measured
    Data size 13.8 GB
    Cold / hot 1.2× faster
    Tags column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  33. Spark (Gluten-on-Velox) (c6a.metal) 2026-05-11 ×16.63
    Hot median 5.97s
    Load time 5s
    Data size 13.8 GB
    Cold / hot 1.3× faster
    Tags C++, column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  34. Spark (c7a.metal-48xl) 2026-05-11 ×16.95
    Hot median 7.17s
    Load time 3s
    Data size 13.8 GB
    Cold / hot 1.4× faster
    Tags column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  35. Spark (c8g.metal-48xl) 2026-05-11 ×17.02
    Hot median 6.39s
    Load time 3s
    Data size 13.8 GB
    Cold / hot 1.5× faster
    Tags column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  36. Spark (c6a.metal) 2026-05-11 ×17.03
    Hot median 6.74s
    Load time Not measured
    Data size 13.8 GB
    Cold / hot 1.3× faster
    Tags column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  37. Spark (Gluten-on-Velox) (c6a.2xlarge) 2026-05-11 ×17.08
    Hot median 6.19s
    Load time 4s
    Data size 13.8 GB
    Cold / hot 1.2× faster
    Tags C++, column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  38. Spark (Comet) (c7a.metal-48xl) 2026-05-11 ×17.24
    Hot median 6.09s
    Load time 3s
    Data size 13.8 GB
    Cold / hot 1.4× faster
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →
  39. Spark (Comet) (c6a.metal) 2026-05-11 ×17.57
    Hot median 6.55s
    Load time 5s
    Data size 13.8 GB
    Cold / hot 1.3× faster
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →
  40. Spark (Comet) (c6a.4xlarge) 2026-05-11 ×18.25
    Hot median 5.95s
    Load time 10s
    Data size 13.8 GB
    Cold / hot 1.3× faster
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →
  41. Spark (Auron) (c6a.2xlarge) 2026-05-11 ×18.39
    Hot median 6.31s
    Load time 4s
    Data size 13.8 GB
    Cold / hot 1.1× faster
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →
  42. Spark (c6a.2xlarge) 2026-05-11 ×21.22
    Hot median 9.05s
    Load time 4s
    Data size 13.8 GB
    Cold / hot similar
    Tags column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  43. Spark (Comet) (c6a.2xlarge) 2026-05-11 ×23.00
    Hot median 8.43s
    Load time 4s
    Data size 13.8 GB
    Cold / hot 1.2× faster
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →
  44. Spark (Gluten-on-Velox) (c6a.xlarge) 2026-05-11 ×24.40
    Hot median 9.93s
    Load time 1s
    Data size 13.8 GB
    Cold / hot 1.1× faster
    Tags C++, column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  45. Spark (Auron) (c6a.xlarge) 2026-05-11 ×26.38
    Hot median 11.21s
    Load time 1s
    Data size 13.8 GB
    Cold / hot similar
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →
  46. Spark (c6a.xlarge) 2026-05-11 ×30.43
    Hot median 14.51s
    Load time 1s
    Data size 13.8 GB
    Cold / hot similar
    Tags column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  47. Spark (Comet) (c6a.xlarge) 2026-05-11 ×33.25
    Hot median 14.08s
    Load time 1s
    Data size 13.8 GB
    Cold / hot similar
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →
  48. Spark (Gluten-on-Velox) (c6a.large) 2026-05-11 ×38.41
    Hot median 18.35s
    Load time Not measured
    Data size 13.8 GB
    Cold / hot similar
    Tags C++, column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  49. Spark (Auron) (c6a.large) 2026-05-11 ×42.94
    Hot median 19.71s
    Load time Not measured
    Data size 13.8 GB
    Cold / hot similar
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →
  50. Spark (c6a.large) 2026-05-11 ×49.81
    Hot median 27.86s
    Load time Not measured
    Data size 13.8 GB
    Cold / hot similar
    Tags column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  51. Spark (Comet) (c6a.large) 2026-05-11 ×54.35
    Hot median 25.86s
    Load time Not measured
    Data size 13.8 GB
    Cold / hot similar
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →
  52. Spark (Gluten-on-Velox) (t3a.small) 2026-05-11 ×67.44
    Hot median 32.26s
    Load time Not measured
    Data size 13.8 GB
    Cold / hot similar
    Tags C++, column-oriented, Java, Spark derivative, stateless
    View raw timings on GitHub →
  53. Spark (Auron) (c6a.metal) 2026-05-11 ×82.84
    Hot median 40.29s
    Load time Not measured
    Data size 13.8 GB
    Cold / hot similar
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →
  54. Spark (Auron) (c7a.metal-48xl) 2026-05-11 ×84.59
    Hot median 42.07s
    Load time Not measured
    Data size 13.8 GB
    Cold / hot similar
    Tags column-oriented, Java, Rust, Spark derivative, stateless
    View raw timings on GitHub →

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.