bench package - modernc.org/sqlite-bench - Go Packages

14 min read Original article ↗

logo-png

Go Reference

The SQLite Drivers 26.07 Benchmarks Game

This repository is a modification of go-sqlite-bench, forked at 4df8bfd.

Category: database/sql drivers

For the non database/sql drivers category please see modernc.org/sqlite-bench2

[[TOC]]

Drivers

These drivers are benchmarked

Go version: go1.26.5

A general note on benchmarks and this repository

Do not trust benchmarks, write your own. These specific benchmarks are modelled after someone's very own database usage scenarios. Your scenarios may be totally different.

Each test is run twice, the recorded values are the averages of the two runs. This is not very scientific.

Database Schema

The test database consist of the following tables and indices:

PRAGMA journal_mode=DELETE;
PRAGMA synchronous=FULL;
PRAGMA foreign_keys=1;
PRAGMA busy_timeout=5000;

CREATE TABLE users (
    id INTEGER PRIMARY KEY NOT NULL,
    created INTEGER NOT NULL,
    email TEXT NOT NULL,
    active INTEGER NOT NULL);
CREATE INDEX users_created ON users(created);

CREATE TABLE articles (
    id INTEGER PRIMARY KEY NOT NULL,
    created INTEGER NOT NULL,  
    userId INTEGER NOT NULL REFERENCES users(id),
    text TEXT NOT NULL);
CREATE INDEX articles_created ON articles(created);
CREATE INDEX articles_userId ON articles(userId);

CREATE TABLE comments (
    id INTEGER PRIMARY KEY NOT NULL,
    created INTEGER NOT NULL,
    articleId INTEGER NOT NULL REFERENCES articles(id),
    text TEXT NOT NULL);
CREATE INDEX comments_created ON comments(created);
CREATE INDEX comments_articleId ON comments(articleId);
Benchmark Results

Result times are measured in milliseconds. Lower numbers indicate better performance.


Simple Benchmark

Insert 1 million user rows in one database transaction. Then query all users once.

Complex Benchmark

Insert 200 users in one database transaction. Then insert 20000 articles (100 articles for each user) in another transaction. Then insert 400000 comments (20 comments for each article) in another transaction. Then query all users, articles and comments in one big JOIN statement.

Many Benchmark

Insert N users in one database transaction. Then query all users 1000 times. This benchmark is used to simluate a read-heavy use case.

Large Benchmark

Insert 10000 users with N bytes of row content. Then query all users. This benchmark is used to simluate reading of large (gigabytes) databases.

Concurrent Benchmark

Insert one million users. Then have N goroutines query all users. This benchmark is used to simulate concurrent reads.

4GB RAM builders

On 32 bit architectures and on the linux/ppc64le builder - to avoid OOM

  • the Large benchmark uses 2.5k users instead of a 10k.
  • the Concurrent benchmark uses 250k users instead of a million.

Caveat emptor

Mistakes happen. If you find anything wrong about the results please report the problem at the issue tracker, thank you.


tl;dr: Scorecard

The best time in every test, shown in bold in the tables below individual graphs, is worth one point. The scorecard shows where and how many points were awarded to each benchmarked package.

Total score ties are ranked alphabetically. Please read those as one shared rank.

This score is an ad hoc aggregate metric. Its usefulness is possibly at most in showing how the scores may evolve in time when new, improved versions of packages will get benchmarked.

The time results for the particular OS and HW provide a more detailed info.

Total Simple Complex Many Large Concurrent
1. mattn 112 21 28 23 22 18
2. modernc 57 9 2 20 2 24
3. ncruces 39 2 2 5 24 6

Disclaimer: The score and the ranking do not show how will any package perform in your particular application on a particular system. Additionally, empirically the scores fluctuate as much as about +/- 10 points. It's complicatd to better stabilize the results to be more precise and reliable. On some machines the tests run for many hours already with n = 2.

Results: darwin/amd64

  • OS: macOS Tahoe 26.4
  • CPU: Apple M1, 2020
  • GOMAXPROCS: 8
  • RAM: 8GB
  • Disk: APPLE SSD AP0256Q Media (251GB)

darwin/amd64-simple-png

Simple insert query
mattn *7444 2940
modernc 10469 *2927
ncruces 9991 3300

Lower numbers are better. * Scorecard point awarded.

darwin/amd64-complex-png

Complex insert query
mattn *4515 3681
modernc 7607 *3591
ncruces 7185 4018

Lower numbers are better. * Scorecard point awarded.

darwin/amd64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn 104 349 2434
modernc *89 *262 *1854
ncruces 117 319 2192

Lower numbers are better. * Scorecard point awarded.

darwin/amd64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 795 1526 4977
modernc 1032 1553 *4579
ncruces *657 *1224 4766

Lower numbers are better. * Scorecard point awarded.

darwin/amd64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 3660 3475 7240
modernc *2514 *2834 *5334
ncruces 3255 3490 6489

Lower numbers are better. * Scorecard point awarded.

Results: darwin/arm64

  • OS: macOS Tahoe 26.4
  • CPU: Apple M1, 2020
  • GOMAXPROCS: 8
  • RAM: 8GB
  • Disk: APPLE SSD AP0256Q Media (251GB)

darwin/arm64-simple-png

Simple insert query
mattn *3651 *1575
modernc 9283 1766
ncruces 6859 1862

Lower numbers are better. * Scorecard point awarded.

darwin/arm64-complex-png

Complex insert query
mattn *2352 *2007
modernc 7188 3389
ncruces 4580 3153

Lower numbers are better. * Scorecard point awarded.

darwin/arm64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *62 *177 *1345
modernc 66 211 1552
ncruces 82 234 1630

Lower numbers are better. * Scorecard point awarded.

darwin/arm64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 614 1288 5045
modernc 655 1109 4700
ncruces *374 *671 *4234

Lower numbers are better. * Scorecard point awarded.

darwin/arm64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *1705 *2041 *4150
modernc 1828 2197 4418
ncruces 1953 2311 4790

Lower numbers are better. * Scorecard point awarded.

Results: freebsd/amd64

  • OS: FreeBSD 15.0
  • CPU: qemu-system-x86_64 linux/amd64-0
  • GOMAXPROCS: 2
  • RAM: 8GB
  • Disk: qemu qcow2 (64GB)

freebsd/amd64-simple-png

Simple insert query
mattn *2214 1096
modernc 3193 *926
ncruces 3338 1200

Lower numbers are better. * Scorecard point awarded.

freebsd/amd64-complex-png

Complex insert query
mattn *1248 *1182
modernc 2186 1398
ncruces 2177 1732

Lower numbers are better. * Scorecard point awarded.

freebsd/amd64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *26 108 970
modernc 28 *100 *837
ncruces 33 128 1114

Lower numbers are better. * Scorecard point awarded.

freebsd/amd64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 310 612 *1027
modernc 611 1155 2429
ncruces *286 *610 2501

Lower numbers are better. * Scorecard point awarded.

freebsd/amd64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 1624 2822 5274
modernc *1138 *2302 *4580
ncruces 1333 2930 5771

Lower numbers are better. * Scorecard point awarded.

Results: freebsd/arm64

  • OS: FreeBSD 15.0
  • CPU: qemu-system-aarch64 linux/amd64-0
  • GOMAXPROCS: 2
  • RAM: 8GB
  • Disk: qemu qcow2 (64GB)

freebsd/arm64-simple-png

Simple insert query
mattn *53952 28230
modernc 74339 *21909
ncruces 103308 32283

Lower numbers are better. * Scorecard point awarded.

freebsd/arm64-complex-png

Complex insert query
mattn *27100 29985
modernc 46478 *28859
ncruces 60523 38572

Lower numbers are better. * Scorecard point awarded.

freebsd/arm64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn 906 2317 29395
modernc *729 *2232 *22778
ncruces 750 2596 28914

Lower numbers are better. * Scorecard point awarded.

freebsd/arm64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 9555 17576 37856
modernc 16340 28789 56048
ncruces *8362 *14815 *24918

Lower numbers are better. * Scorecard point awarded.

freebsd/arm64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 32192 57325 *109237
modernc *27763 *55285 110002
ncruces 32345 63883 132904

Lower numbers are better. * Scorecard point awarded.

Results: linux/386

  • OS: Devuan GNU/Linux 5 (daedalus)
  • CPU: qemu-system-i386 linux/amd64-0
  • GOMAXPROCS: 2
  • RAM: 4GB
  • Disk: qemu qcow2 (64GB)

linux/386-simple-png

Simple insert query
mattn *2592 1630
modernc 4058 *1544
ncruces 3970 1627

Lower numbers are better. * Scorecard point awarded.

linux/386-complex-png

Complex insert query
mattn *1446 *1768
modernc 2566 2139
ncruces 2544 2384

Lower numbers are better. * Scorecard point awarded.

linux/386-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *31 *158 1462
modernc 36 159 *1407
ncruces 41 169 1481

Lower numbers are better. * Scorecard point awarded.

linux/386-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *56 129 *231
modernc 125 214 421
ncruces 65 *125 242

Lower numbers are better. * Scorecard point awarded.

linux/386-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 468 957 1896
modernc *419 *896 *1818
ncruces 435 962 1867

Lower numbers are better. * Scorecard point awarded.

Results: linux/amd64

  • OS: Devuan GNU/Linux 5 (daedalus)
  • CPU: Intel(R) Celeron(R) J4005 CPU @ 2.00GHz
  • GOMAXPROCS: 2
  • RAM: 8GB
  • Disk: SanDisk SDSSDHII, 447GiB (480GB)

linux/amd64-simple-png

Simple insert query
mattn *7029 *3070
modernc 10135 3315
ncruces 10469 3655

Lower numbers are better. * Scorecard point awarded.

linux/amd64-complex-png

Complex insert query
mattn *4043 *3180
modernc 6758 4138
ncruces 6316 4231

Lower numbers are better. * Scorecard point awarded.

linux/amd64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn 133 542 5003
modernc *117 *498 5033
ncruces 133 516 *3060

Lower numbers are better. * Scorecard point awarded.

linux/amd64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *781 *1242 *2875
modernc 1794 2861 5513
ncruces 1027 1786 3875

Lower numbers are better. * Scorecard point awarded.

linux/amd64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 3471 6705 13445
modernc *3073 *6697 *12976
ncruces 3484 8315 16094

Lower numbers are better. * Scorecard point awarded.

Results: linux/amd64-0

  • OS: Devuan GNU/Linux 6 (excalibur)
  • CPU: AMD Ryzen 9 3900X 12-Core Processor
  • GOMAXPROCS: 24
  • RAM: 128GB
  • Disk: NVMe, 476GiB (512GB)

linux/amd64-0-simple-png

Simple insert query
mattn *2157 1085
modernc 3908 *1065
ncruces 3460 1191

Lower numbers are better. * Scorecard point awarded.

linux/amd64-0-complex-png

Complex insert query
mattn *1193 *1157
modernc 2614 1570
ncruces 2275 1780

Lower numbers are better. * Scorecard point awarded.

linux/amd64-0-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *27 *116 *1011
modernc 33 119 1015
ncruces 38 135 1217

Lower numbers are better. * Scorecard point awarded.

linux/amd64-0-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 293 482 959
modernc 607 989 1722
ncruces *241 *421 *910

Lower numbers are better. * Scorecard point awarded.

linux/amd64-0-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 1221 1372 *1590
modernc *1185 *1365 1597
ncruces 1334 1464 1629

Lower numbers are better. * Scorecard point awarded.

Results: linux/arm

  • OS: Raspbian GNU/Linux 12 (bookworm)
  • CPU: Cortex-A72 (Raspberry Pi 4 Model B Rev 1.2)
  • GOMAXPROCS: 4
  • RAM: 4GB
  • Disk: SanDisk SD Card SR256, 238GiB (255GB)

linux/arm-simple-png

Simple insert query
mattn *20949 *10467
modernc 27184 11673
ncruces 38897 13996

Lower numbers are better. * Scorecard point awarded.

linux/arm-complex-png

Complex insert query
mattn *8919 *9401
modernc 16897 12825
ncruces 23100 17091

Lower numbers are better. * Scorecard point awarded.

linux/arm-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *172 *931 *8537
modernc 207 1009 9702
ncruces 300 1403 12980

Lower numbers are better. * Scorecard point awarded.

linux/arm-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *291 *456 874
modernc 555 907 1504
ncruces 369 603 *855

Lower numbers are better. * Scorecard point awarded.

linux/arm-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *2478 *3192 *6469
modernc 2861 3238 6503
ncruces 3514 3993 7982

Lower numbers are better. * Scorecard point awarded.

Results: linux/arm64

  • OS: Raspbian GNU/Linux 12 (bookworm)
  • CPU: Cortex-A76 (Raspberry Pi 5 Model B Rev 1.0)
  • GOMAXPROCS: 4
  • RAM: 8GB
  • Disk: NVMe, 238GiB (256GB)

linux/arm64-simple-png

Simple insert query
mattn *3136 *1556
modernc 6462 1826
ncruces 5789 1791

Lower numbers are better. * Scorecard point awarded.

linux/arm64-complex-png

Complex insert query
mattn *1741 *1872
modernc 4268 2929
ncruces 3572 2808

Lower numbers are better. * Scorecard point awarded.

linux/arm64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *33 *149 *1381
modernc 42 180 1692
ncruces 46 181 1633

Lower numbers are better. * Scorecard point awarded.

linux/arm64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 311 524 1859
modernc 423 775 1286
ncruces *242 *441 *993

Lower numbers are better. * Scorecard point awarded.

linux/arm64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *1846 *2317 *4548
modernc 2019 2547 5112
ncruces 2184 2784 5817

Lower numbers are better. * Scorecard point awarded.

Results: linux/loong64

  • OS: Fedora Linux 42
  • CPU: loongarch64
  • GOMAXPROCS: 4
  • RAM: 16GB
  • Disk: NVMe, (157GB)

linux/loong64-simple-png

Simple insert query
mattn *5614 3526
modernc 9253 3145
ncruces 9530 *2612

Lower numbers are better. * Scorecard point awarded.

linux/loong64-complex-png

Complex insert query
mattn *2859 3830
modernc 6019 4266
ncruces 5654 *3690

Lower numbers are better. * Scorecard point awarded.

linux/loong64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *78 362 3261
modernc 85 345 2899
ncruces 114 *336 *2406

Lower numbers are better. * Scorecard point awarded.

linux/loong64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *387 *724 *1335
modernc 825 1410 2212
ncruces 422 847 1577

Lower numbers are better. * Scorecard point awarded.

linux/loong64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 4067 4273 4336
modernc 3725 3844 4040
ncruces *3068 *3299 *3583

Lower numbers are better. * Scorecard point awarded.

Results: linux/ppc64le

  • OS: Debian GNU/Linux 13 (trixie)
  • CPU: qemu hosted on POWER8
  • GOMAXPROCS: 2
  • RAM: 8GB
  • Disk: qemu unknown, 40GiB (42GB)

linux/ppc64le-simple-png

Simple insert query
mattn *7385 4803
modernc 10887 4326
ncruces 9541 *4245

Lower numbers are better. * Scorecard point awarded.

linux/ppc64le-complex-png

Complex insert query
mattn *4076 4346
modernc 7394 5357
ncruces 5631 *4033

Lower numbers are better. * Scorecard point awarded.

linux/ppc64le-many-png

Many query/N=10 query/N=100 query/N=1000
mattn 97 420 4014
modernc *95 437 3914
ncruces 103 *391 *3151

Lower numbers are better. * Scorecard point awarded.

linux/ppc64le-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 130 204 *350
modernc 281 461 759
ncruces *117 *196 386

Lower numbers are better. * Scorecard point awarded.

linux/ppc64le-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 1287 1606 3132
modernc 1312 1580 2781
ncruces *991 *1344 *2346

Lower numbers are better. * Scorecard point awarded.

Results: linux/riscv64

  • OS: Ubuntu 22.04.5
  • CPU: riscv64, sifive,bullet0
  • GOMAXPROCS: 4
  • RAM: 16GB
  • Disk: NVMe 917GB

linux/riscv64-simple-png

Simple insert query
mattn *33268 19311
modernc 55533 *18171
ncruces 85920 28304

Lower numbers are better. * Scorecard point awarded.

linux/riscv64-complex-png

Complex insert query
mattn *19047 *17530
modernc 35173 21952
ncruces 52889 36809

Lower numbers are better. * Scorecard point awarded.

linux/riscv64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *334 1614 14565
modernc 374 *1562 *14049
ncruces 611 2476 22302

Lower numbers are better. * Scorecard point awarded.

linux/riscv64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *5440 *10789 *20848
modernc 8470 15230 28831
ncruces 5960 11444 22925

Lower numbers are better. * Scorecard point awarded.

linux/riscv64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *18695 26114 51357
modernc 21044 *25856 *49067
ncruces 30240 35408 67016

Lower numbers are better. * Scorecard point awarded.

Results: linux/s390x

  • OS: "Debian GNU/Linux 12 (bookworm)
  • CPU: qemu-system-s390x linux/amd64-0
  • GOMAXPROCS: 2
  • RAM: 24GB
  • Disk: qemu qcow2 (64GB)

linux/s390x-simple-png

Simple insert query
mattn *57871 29761
modernc 107496 *22754
ncruces 80358 27862

Lower numbers are better. * Scorecard point awarded.

linux/s390x-complex-png

Complex insert query
mattn *31777 *24281
modernc 71931 28339
ncruces 49014 31987

Lower numbers are better. * Scorecard point awarded.

linux/s390x-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *1207 3025 19954
modernc 1293 *2988 *17074
ncruces 1560 3387 21464

Lower numbers are better. * Scorecard point awarded.

linux/s390x-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *14408 *20219 *44336
modernc 29369 44570 83378
ncruces 15421 27479 49663

Lower numbers are better. * Scorecard point awarded.

linux/s390x-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 30472 36611 75075
modernc *20791 *25093 *60839
ncruces 28730 30585 61635

Lower numbers are better. * Scorecard point awarded.

Results: windows/386

  • OS: Windows 10 Pro 22H2
  • CPU: qemu-system-x86_64 linux/amd64-0
  • GOMAXPROCS: 2
  • RAM: 4GB
  • Disk: qemu qcow2 (64GB)

windows/386-simple-png

Simple insert query
mattn *3023 1615
modernc 4632 *1519
ncruces 4445 1671

Lower numbers are better. * Scorecard point awarded.

windows/386-complex-png

Complex insert query
mattn *1646 *1724
modernc 2746 2088
ncruces 2766 2415

Lower numbers are better. * Scorecard point awarded.

windows/386-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *75 *183 1444
modernc 79 195 *1406
ncruces 91 218 1563

Lower numbers are better. * Scorecard point awarded.

windows/386-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *142 *6193 *26811
modernc 194 6920 28022
ncruces 177 9550 29976

Lower numbers are better. * Scorecard point awarded.

windows/386-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *764 *1027 *1657
modernc 857 1166 1884
ncruces 826 1363 1952

Lower numbers are better. * Scorecard point awarded.

Results: windows/amd64

  • OS: Windows 11 Pro 23H2
  • CPU: Intel Pentium G4400T @2.9GHz
  • GOMAXPROCS: 2
  • RAM: 8GB
  • Disk: KGB50ZNT256G LS KIOXIA (238GB)

windows/amd64-simple-png

Simple insert query
mattn *2520 1225
modernc 4026 *1214
ncruces 4812 1578

Lower numbers are better. * Scorecard point awarded.

windows/amd64-complex-png

Complex insert query
mattn *1545 *1366
modernc 2753 1843
ncruces 3270 2377

Lower numbers are better. * Scorecard point awarded.

windows/amd64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn 111 172 1130
modernc *84 *161 *1100
ncruces 89 211 1484

Lower numbers are better. * Scorecard point awarded.

windows/amd64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 2229 5361 *18551
modernc 849 1438 19780
ncruces *659 *1199 19278

Lower numbers are better. * Scorecard point awarded.

windows/amd64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 1643 3631 6427
modernc *1444 *3133 *6346
ncruces 1960 4054 8258

Lower numbers are better. * Scorecard point awarded.

Results: windows/arm64

  • OS: Windows 11 Pro 23H2
  • CPU: Cortex-A72 (Raspberry Pi)
  • GOMAXPROCS: 4
  • RAM: 8GB
  • Disk: Generic SK64 SD Card (64GB)

windows/arm64-simple-png

Simple insert query
mattn *12437 *4792
modernc 22860 4831
ncruces 27508 6911

Lower numbers are better. * Scorecard point awarded.

windows/arm64-complex-png

Complex insert query
mattn *6815 *4768
modernc 13034 6651
ncruces 14926 8121

Lower numbers are better. * Scorecard point awarded.

windows/arm64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *335 *736 *4608
modernc 403 823 4725
ncruces 553 1116 6774

Lower numbers are better. * Scorecard point awarded.

windows/arm64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 23379 60699 230233
modernc 5225 34251 *150290
ncruces *4124 *8176 174026

Lower numbers are better. * Scorecard point awarded.

windows/arm64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *5980 *6780 *13160
modernc 8089 7472 13629
ncruces 7970 9089 18206

Lower numbers are better. * Scorecard point awarded.