asopi tech
asopi techIndie Developer
Alopex DB v0.8.16: Performance Compared with Other Products

[October 2026 edition]

Alopex DB v0.8.16: Performance Compared with Other Products

Published: Oct 27, 2026
Reading time: ~5 min

Introduction

We develop Alopex DB in Rust as a single engine for DataFrame, SQL, KV, and vector search workloads. It also provides a Python API. As the developers of a newer database, we use performance comparisons with established products and libraries as an important development benchmark.

Summary and Conclusion

We compared Alopex DB v0.8.16 with Polars, SQLite, PostgreSQL, DataFusion, LMDB, hnswlib, and Faiss HNSW in fixed test cases using Python APIs on a single host. Alopex DB was faster at DataFrame construction and persistent writes to an embedded KV store. It was slower at DataFrame computation, SQL, KV reads, and HNSW search.

Test Conditions

ItemCondition
VersionsPython wheel alopex==0.8.16; alopex-server 0.8.16
EnvironmentAMD Ryzen 5 3500U; Linux x86_64 / WSL2; Python 3.11.11
MeasurementFixed data; p50 for each trial; comparison based on the median of three trials
SQL comparisonAlopex DB and PostgreSQL ran in server/client configurations on the same host and reused existing connections
KV comparisonThe embedded Python APIs of Alopex DB and LMDB ran on the same CPU
CacheWarm cache

These results apply to fixed data and Python APIs on a single shared host. We did not measure the Rust API, distributed processing, concurrent load, cold-disk I/O, or datasets larger than memory.

What We Measured

Compared withAPI typeOperations compared
PolarsDataFrame APIConstruction from Python data, column computation after construction, conversion to a Python dict, and composite operations containing these steps
PolarsLazy and streaming APIsReading CSV and Parquet, column computation, collect, and retrieval of all batches
SQLiteSQL APISELECT, transactions, savepoints, prepared queries, and constrained INSERT operations
PostgreSQLSQL APIAggregation, sorting, retrieval of all results, persistent writes, point reads, updates, and deletes
DataFusionSQL streaming APIRetrieval and complete consumption of rows matching a condition
LMDBEmbedded KV APIPersistent writes, point reads, overwrites, deletes, and range scans
hnswlib and Faiss HNSWHNSW search APITop-10 search at the same recall threshold

We again did not measure random DataFrame access or file writes and exports.

Performance Results

The time ratio in each table is Alopex DB time divided by the comparison target’s time. A ratio below 1 means Alopex DB was faster; a ratio above 1 means the comparison target was faster. Each reported time is the median of three trials, with each trial measured at p50. We include only measurements whose processing results matched.

DataFrame and File Reads

Compared withTest caseAlopex DB timeComparison timeTime ratio
PolarsConstruct a DataFrame from Python data18.270 ms557.278 ms0.033
PolarsCompute 12 columns on an existing DataFrame and collect5.405 ms3.286 ms1.645
PolarsConvert 12 computed columns to a Python dict9.975 ms10.111 ms0.987
PolarsConstruction plus materialization of intermediate and final results214.644 ms775.785 ms0.277
PolarsPrevious composite operation, including construction, computation, and Python conversion171.293 ms1,264.226 ms0.135
PolarsLazy CSV, compute 12 columns, then collect13.843 ms7.226 ms1.916
PolarsLazy CSV, compute 12 columns, then retrieve all batches15.149 ms7.790 ms1.945
PolarsLazy Parquet, 11 numeric and other columns, then collect2.916 ms3.559 ms0.819
PolarsLazy Parquet, 11 numeric and other columns, then retrieve all batches3.648 ms4.257 ms0.857
PolarsFully consume CSV streaming output16.798 ms7.299 ms2.301
PolarsFully consume Parquet streaming output4.984 ms4.795 ms1.039

Alopex DB was faster at DataFrame construction, while Polars was faster at computation after construction. The composite operations include construction, computation, explode, concat, and Python conversion, so they are not comparisons of computation alone. The per-operation results appear in the individual rows above.

The trial ranges for conversion to a Python dict overlapped, so the result does not establish an advantage for either product. For file reads, Polars was faster with CSV, while Alopex DB was faster in the Parquet operations that we were able to measure.

In v0.8.16, Alopex DB does not support the Polars-compatible select, direct construction and addition of Series, direct construction of a LazyFrame, scan_csv, or scan_parquet operations. We could run the lazy comparison through Alopex DB’s own static scan, but the 12-column Parquet computation that included string concatenation failed because of a type mismatch between Utf8 and LargeUtf8. We do not claim Polars compatibility for these six APIs and operations or for Parquet string computation.

SQL

Compared withTest caseAlopex DB timeComparison timeTime ratio
SQLiteSELECT, transaction, savepoint, prepared query, and constrained INSERT33.740 ms3.533 ms9.551
PostgreSQLCOUNT72.274 ms5.353 ms13.501
PostgreSQLORDER BY id LIMIT 1636.333 ms1.339 ms27.132
PostgreSQLRetrieve all 17,125 rows242.455 ms42.426 ms5.715
PostgreSQLINSERT RETURNING plus rollback5.289 ms2.948 ms1.794
PostgreSQLSingle-row INSERT plus commit9.302 ms4.336 ms2.145
PostgreSQL100-row INSERT plus commit20.754 ms6.200 ms3.347
PostgreSQL100 random-get hits294.737 ms119.212 ms2.472
PostgreSQL100 random-get misses283.025 ms107.088 ms2.643
PostgreSQLRandom UPDATE plus commit11.620 ms4.604 ms2.524
PostgreSQLRandom DELETE plus commit220.362 ms4.403 ms50.053
DataFusionFully consume SQL streaming output59.427 ms1.277 ms46.522

SQL took longer in Alopex DB than in the comparison target for every case measured. The gaps were particularly large for sequential reads compared with DataFusion and deletes compared with PostgreSQL. SQL needs improvement across both read and write operations.

In the DataFusion comparison, Alopex DB returns Python rows while DataFusion returns Arrow batches. The reported times therefore include not only SQL execution but also conversion to each result format and complete consumption of the results in Python.

Compared withTest caseAlopex DB timeComparison timeTime ratio
LMDBSingle PUT plus commit0.996 ms2.137 ms0.466
LMDB100 sequential PUT operations plus commit4.529 ms5.818 ms0.778
LMDB100 shuffled-order PUT operations plus commit4.272 ms5.462 ms0.782
LMDB100 random-get hits1.257 ms0.188 ms6.700
LMDB100 random-get misses0.241 ms0.181 ms1.334
LMDBRandom overwrite plus commit1.061 ms2.560 ms0.415
LMDBRandom DELETE plus commit1.104 ms2.425 ms0.455
LMDBRange scan of 1,000 entries with all values retrieved8.797 ms0.502 ms17.538
hnswlibHNSW search at recall 0.99 or higher152.374 µs50.534 µs3.015
Faiss HNSWHNSW search at recall 0.99 or higher152.374 µs56.790 µs2.683

The embedded KV implementation was faster than LMDB for persistent writes, overwrites, and deletes. That is a strength of Alopex DB v0.8.16 in these fixed test cases. LMDB was faster for point reads and range scans, however, producing a clear contrast between write and read performance.

All products met the required search-recall threshold in the HNSW comparison. Under that condition, Alopex DB took longer to search and needs to reduce search time while preserving recall.

Planned Improvements

Our next development priorities are SQL streaming and random DELETE. We will also work on SQL reads and writes generally, KV point reads and range scans, DataFrame computation, lazy CSV, Parquet string computation, and the unsupported Polars-compatible APIs. For HNSW, we will reduce search time while maintaining recall of at least 0.99.

After making these improvements, we will measure again at the same input and API boundaries and publish the results.

Summary

Alopex DB v0.8.16 is strong at DataFrame construction and persistent writes to its embedded KV store. Its DataFrame computation, SQL, KV reads, and HNSW search need improvement. Some Polars-compatible operations also remain unsupported.

We will use these results as a baseline for further development and publish the performance after the changes.