Lance is an open lakehouse format for multimodal AI data, claiming 100x faster random access than Parquet, with vector and full-text indexes in the format specification and versioning built in.
Lance spans file format, table format, and catalog spec in one Rust core with Python bindings. Rows land in fragments on local disk or object storage; MVCC gives transactional commits, using conditional puts or DynamoDB on S3. You compact fragments, optimize indexes, and clean old versions, with configurable auto-cleanup. It plugs into pandas, Polars, Ray, PyTorch, DuckDB, and Spark, and LanceDB builds a vector database on top.
How Lance answers the questions Table Formats turns on.
| How it works | |
| Catalog | Lance Namespace spec; also Polaris, Unity, Gravitino |
| Update model | MVCC transactional updates; add columns without rewrite |
| Partitioning | None: rows land in fragments, not partition columns |
| Schema evolution | Zero-copy: add, drop and reorder columns as metadata only |
| Concurrent writers | MVCC with retries: appends scale, updates conflict; S3 uses conditional put or DynamoDB |
| Indexes | The strength: IVF and HNSW vector, BTree, bitmap, label list, n-gram, inverted full-text |
| Change feed | Version history and time travel; change feed in development |
| Running it | |
| Maintenance | Compact fragments, optimize indexes, clean old versions; auto-cleanup configurable |
| Connections | |
| Engine support | Python and Rust first; DuckDB, Spark, Ray, Trino |
| Cross-format reads | No metadata bridge: catalogs can hold Lance beside Iceberg, but the data stays Lance |
vs Lance: Java
vs Lance: Java, Python, Rust, Go
vs Lance: Java