Skip to content

Performance

sql-splitter is designed for high throughput with minimal memory usage.

Tested on Apple M2 Max:

MetricValue
Parser throughput600+ MB/s
Memory usage~50 MB constant
Cold start~5 ms
File SizeTimeThroughput
100 MB0.16s625 MB/s
1 GB1.6s625 MB/s
10 GB16s625 MB/s
ToolTime (1 GB file)
sql-splitter1.6s
awk-based8.5s
Python script12s

sql-splitter is 5x faster than shell-based alternatives.

Build with CPU-specific optimizations:

Terminal window
RUSTFLAGS="-C target-cpu=native" cargo build --release

Compressed files can be faster than uncompressed when I/O is the bottleneck:

Terminal window
# Often faster than reading uncompressed
sql-splitter split backup.sql.gz -o tables/

Avoid intermediate files when possible:

Terminal window
# Direct stream (no intermediate file)
sql-splitter convert mysql.sql.gz --to postgres -o - | psql "$PG_CONN"
# vs. intermediate file (slower)
sql-splitter convert mysql.sql.gz --to postgres -o temp.sql
psql "$PG_CONN" < temp.sql
rm temp.sql

For many files, use parallel execution:

Terminal window
find dumps -name '*.sql.gz' -print0 | \
xargs -0 -n1 -P4 sql-splitter validate --strict

Cache imported databases for repeated queries:

Terminal window
# First query (slow - imports data)
sql-splitter query dump.sql "SELECT COUNT(*) FROM users" --cache
# Second query (fast - uses cache)
sql-splitter query dump.sql "SELECT * FROM users WHERE active = 1" --cache

For very large dumps:

Terminal window
sql-splitter query huge.sql "SELECT ..." --disk

sql-splitter maintains constant ~50 MB memory regardless of file size:

  • Streaming: Reads in chunks, processes line-by-line
  • Buffered I/O: Uses 64 KB buffers
  • No full load: Never loads entire file into memory

This means 10 GB files use the same memory as 10 MB files.