Scriptella 1.7.0 caches binding plans for eligible static SQL, reducing repeated parsing and parameter setup. In this one-million-row CSV benchmark, Scriptella was 3.61× faster than the tested Pandas + SQLAlchemy workflow on PostgreSQL and 2.56× on MariaDB. I maintain Scriptella and wanted to publish a reproducible release baseline. Scriptella is maintained by PVR Labs.

This follows the earlier CSV import experiment. For v5, we replaced csvsql with Pandas + SQLAlchemy because csvsql took roughly nine to ten minutes, and added MariaDB's native LOAD DATA LOCAL loader to give both databases a native bulk-loading reference alongside PostgreSQL COPY.

The benchmark used PostgreSQL 17.11 and MariaDB 11.8.8, comparing Scriptella 1.7.0, handwritten JDBC, Pandas + SQLAlchemy, and each database's native loader. Scriptella and JDBC used batches of 1,000. Pandas 2.3.3 read 10,000-row chunks and used to_sql() with 1,000-row insert chunks in one transaction. Both Java paths enabled PostgreSQL batch rewriting.

All implementations used the same deterministic fixture and destination schema, with different parsing, conversion, and insertion paths. A 2,001-row smoke covered all eight cases; each measured import followed a verified 20,000-row warmup. Every import passed independent row-count and sample-value checks.

Median import times in seconds. PostgreSQL: Scriptella 8.747, JDBC 7.642, Pandas 31.551, COPY 1.750. MariaDB: Scriptella 7.950, JDBC 5.755, Pandas 20.377, LOAD DATA LOCAL 3.287.
Median end-to-end durations from two local runs. Dots show individual runs; lower is faster.

These are median seconds from two compatible local v5 runs on an Intel Mac, using Colima with four CPUs and 6 GiB of memory:

DatabaseScriptella 1.7.0JDBCPandas + SQLAlchemyNative load
PostgreSQL8.747 s7.642 s31.551 sCOPY: 1.750 s
MariaDB7.950 s5.755 s20.377 sLOAD DATA LOCAL: 3.287 s

Pandas took longer than Scriptella in both databases, while handwritten JDBC was faster in both. Scriptella provides a concise, declarative, SQL-first ETL approach without handwritten JDBC plumbing. PostgreSQL COPY and MariaDB LOAD DATA LOCAL were fastest: they are optimized direct bulk loaders, with parsing and error semantics that differ from batched inserts. This benchmark measures CSV import, not the broader ETL work of combining sources, transformations, and destinations.

Experiment details

The timings are end to end: they include fresh process startup, parsing, conversion, database writes, commit, and cleanup. The measured import includes 1.7.0's cached binding-plan path, but does not isolate its contribution. Memory use was not measured.

Pandas here is one specific Pandas + SQLAlchemy workflow, not the fastest possible Python importer. Results depend on workload and environment. These medians come from two sequential runs on one machine; case order, caches, startup costs, and host load can affect timings. The chart shows individual runs, not confidence intervals, so treat the results as a local reference rather than a universal ranking.

Scriptella 1.7.0 also adds a JSON/JSONL driver, optional CLI progress, and execution reports. A useful next benchmark is database-to-database migration, where broader ETL functionality can be evaluated. See the 1.7.0 release notes for details.