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

14 min read Original article ↗

logo-png

Go Reference

The SQLite Drivers 26.05 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.2

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 126 22 29 30 25 20
2. ncruces 46 4 2 6 21 13
3. modernc 36 6 1 12 2 15

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 *1759 945
modernc 2155 *617
ncruces 2343 958

Lower numbers are better. * Scorecard point awarded.

darwin/amd64-complex-png

Complex insert query
mattn *998 1065
modernc 1499 *994
ncruces 1532 1190

Lower numbers are better. * Scorecard point awarded.

darwin/amd64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn 24 90 761
modernc *23 *71 *578
ncruces 30 90 669

Lower numbers are better. * Scorecard point awarded.

darwin/amd64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *171 *272 3573
modernc 392 604 *3473
ncruces 258 436 3806

Lower numbers are better. * Scorecard point awarded.

darwin/amd64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 980 1067 1897
modernc *833 *940 1855
ncruces 895 1037 *1704

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 *1138 508
modernc 1637 *495
ncruces 1821 575

Lower numbers are better. * Scorecard point awarded.

darwin/arm64-complex-png

Complex insert query
mattn *633 *656
modernc 1119 813
ncruces 1206 958

Lower numbers are better. * Scorecard point awarded.

darwin/arm64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *15 *54 *453
modernc 16 57 469
ncruces 19 64 516

Lower numbers are better. * Scorecard point awarded.

darwin/arm64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 338 914 3571
modernc 230 408 *1938
ncruces *149 *241 2697

Lower numbers are better. * Scorecard point awarded.

darwin/arm64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *608 *722 1353
modernc 608 828 1307
ncruces 666 751 *1237

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 *2223 1119
modernc 2985 *990
ncruces 3373 1199

Lower numbers are better. * Scorecard point awarded.

freebsd/amd64-complex-png

Complex insert query
mattn *1279 *1187
modernc 1934 1407
ncruces 2178 1681

Lower numbers are better. * Scorecard point awarded.

freebsd/amd64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *24 109 996
modernc 27 *105 *895
ncruces 33 124 1102

Lower numbers are better. * Scorecard point awarded.

freebsd/amd64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 315 552 2662
modernc 635 1199 2162
ncruces *293 *521 *1139

Lower numbers are better. * Scorecard point awarded.

freebsd/amd64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 1579 2747 5475
modernc *1242 *2512 *4941
ncruces 1523 2872 5686

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 *95492 68026
modernc 156338 61259
ncruces 147072 *40995

Lower numbers are better. * Scorecard point awarded.

freebsd/arm64-complex-png

Complex insert query
mattn *69419 63466
modernc 93536 89221
ncruces 78983 *55561

Lower numbers are better. * Scorecard point awarded.

freebsd/arm64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *589 5352 113086
modernc 1768 11150 91565
ncruces 782 *3310 *51938

Lower numbers are better. * Scorecard point awarded.

freebsd/arm64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 26846 41957 102531
modernc 48629 72901 142038
ncruces *11186 *21076 *42541

Lower numbers are better. * Scorecard point awarded.

freebsd/arm64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 101845 145993 256717
modernc 99225 162942 291201
ncruces *31334 *59233 *115095

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 *2747 1789
modernc 4156 1771
ncruces 4311 *1757

Lower numbers are better. * Scorecard point awarded.

linux/386-complex-png

Complex insert query
mattn *1535 *1893
modernc 2648 2317
ncruces 2770 2574

Lower numbers are better. * Scorecard point awarded.

linux/386-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *35 *171 *1571
modernc 40 185 1582
ncruces 46 190 1598

Lower numbers are better. * Scorecard point awarded.

linux/386-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *64 *102 245
modernc 165 259 463
ncruces 68 122 *235

Lower numbers are better. * Scorecard point awarded.

linux/386-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *475 1064 *2031
modernc 476 *1029 2034
ncruces 502 1050 2036

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 *7573 *3092
modernc 11294 3132
ncruces 11695 3806

Lower numbers are better. * Scorecard point awarded.

linux/amd64-complex-png

Complex insert query
mattn *3983 *2791
modernc 7330 3916
ncruces 6845 4214

Lower numbers are better. * Scorecard point awarded.

linux/amd64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *133 *329 *3465
modernc 270 630 5842
ncruces 161 764 3472

Lower numbers are better. * Scorecard point awarded.

linux/amd64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *804 *1538 11762
modernc 1802 3044 5548
ncruces 911 1684 *3715

Lower numbers are better. * Scorecard point awarded.

linux/amd64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 3576 *6267 *13625
modernc *3155 6900 13703
ncruces 3741 8325 16373

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 *2201 1071
modernc 3395 *1045
ncruces 3324 1173

Lower numbers are better. * Scorecard point awarded.

linux/amd64-0-complex-png

Complex insert query
mattn *1176 *1140
modernc 2264 1471
ncruces 2185 1693

Lower numbers are better. * Scorecard point awarded.

linux/amd64-0-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *26 *112 994
modernc 30 117 *984
ncruces 33 134 1117

Lower numbers are better. * Scorecard point awarded.

linux/amd64-0-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 273 536 1070
modernc 653 1231 2207
ncruces *222 *415 *772

Lower numbers are better. * Scorecard point awarded.

linux/amd64-0-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *1154 *1321 1621
modernc 1171 1343 1602
ncruces 1284 1394 *1528

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 *16773 *10120
modernc 27054 11848
ncruces 38412 13511

Lower numbers are better. * Scorecard point awarded.

linux/arm-complex-png

Complex insert query
mattn *8831 *9266
modernc 16334 12773
ncruces 22949 16943

Lower numbers are better. * Scorecard point awarded.

linux/arm-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *171 *879 *8559
modernc 204 1044 9872
ncruces 293 1369 12602

Lower numbers are better. * Scorecard point awarded.

linux/arm-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *319 *479 *972
modernc 659 1097 2041
ncruces 366 567 1079

Lower numbers are better. * Scorecard point awarded.

linux/arm-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *2426 3198 *6412
modernc 2794 *3194 6591
ncruces 3422 3902 7785

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 *3085 *1657
modernc 5291 1775
ncruces 6135 1850

Lower numbers are better. * Scorecard point awarded.

linux/arm64-complex-png

Complex insert query
mattn *1726 *1903
modernc 3311 2528
ncruces 3682 2823

Lower numbers are better. * Scorecard point awarded.

linux/arm64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *33 *155 *1432
modernc 40 175 1644
ncruces 46 179 1658

Lower numbers are better. * Scorecard point awarded.

linux/arm64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *248 473 2399
modernc 531 916 2251
ncruces 257 *467 *1028

Lower numbers are better. * Scorecard point awarded.

linux/arm64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *1891 *2314 *4669
modernc 1970 2609 5427
ncruces 2294 3089 6274

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 *5699 3479
modernc 8730 3433
ncruces 9304 *2517

Lower numbers are better. * Scorecard point awarded.

linux/loong64-complex-png

Complex insert query
mattn *2966 3839
modernc 5454 4355
ncruces 5553 *3591

Lower numbers are better. * Scorecard point awarded.

linux/loong64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *78 365 3245
modernc 85 370 3109
ncruces 115 *326 *2262

Lower numbers are better. * Scorecard point awarded.

linux/loong64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *369 *626 *1286
modernc 1048 1634 2640
ncruces 395 813 1482

Lower numbers are better. * Scorecard point awarded.

linux/loong64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 4113 4047 4340
modernc 3895 3964 4146
ncruces *2898 *3145 *3412

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 *6883 3942
modernc 10061 4369
ncruces 9218 *3520

Lower numbers are better. * Scorecard point awarded.

linux/ppc64le-complex-png

Complex insert query
mattn *3950 *4024
modernc 6746 5362
ncruces 5830 4267

Lower numbers are better. * Scorecard point awarded.

linux/ppc64le-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *84 379 3363
modernc 93 442 3955
ncruces 91 *352 *3035

Lower numbers are better. * Scorecard point awarded.

linux/ppc64le-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *102 *167 *322
modernc 304 482 784
ncruces 120 205 388

Lower numbers are better. * Scorecard point awarded.

linux/ppc64le-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *999 1519 2802
modernc 1272 1561 2890
ncruces 1112 *1334 *2256

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 *33537 20683
modernc 53882 *19655
ncruces 84570 26684

Lower numbers are better. * Scorecard point awarded.

linux/riscv64-complex-png

Complex insert query
mattn *18907 *18804
modernc 34504 23397
ncruces 51952 36004

Lower numbers are better. * Scorecard point awarded.

linux/riscv64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *336 *1574 14448
modernc 370 1588 *14163
ncruces 594 2499 21826

Lower numbers are better. * Scorecard point awarded.

linux/riscv64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *5403 *10893 *19118
modernc 11351 20467 40672
ncruces 5418 11162 24754

Lower numbers are better. * Scorecard point awarded.

linux/riscv64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *20999 26894 51598
modernc 21281 *25737 *48919
ncruces 26594 34688 67191

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 *55581 27494
modernc 98026 *23437
ncruces 76566 28071

Lower numbers are better. * Scorecard point awarded.

linux/s390x-complex-png

Complex insert query
mattn *31195 *24394
modernc 66477 28437
ncruces 47174 30424

Lower numbers are better. * Scorecard point awarded.

linux/s390x-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *1152 2908 18664
modernc 1162 *2644 *17028
ncruces 1508 3643 19597

Lower numbers are better. * Scorecard point awarded.

linux/s390x-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *15209 *23867 *41078
modernc 29771 48110 93332
ncruces 16737 25046 47705

Lower numbers are better. * Scorecard point awarded.

linux/s390x-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 26312 36222 73954
modernc *23810 *27034 *53324
ncruces 24118 27327 59054

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 *3228 *1690
modernc 4759 1690
ncruces 4535 1776

Lower numbers are better. * Scorecard point awarded.

windows/386-complex-png

Complex insert query
mattn *1796 *1891
modernc 2676 2183
ncruces 2897 2643

Lower numbers are better. * Scorecard point awarded.

windows/386-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *65 *208 1593
modernc 87 218 *1584
ncruces 95 253 1692

Lower numbers are better. * Scorecard point awarded.

windows/386-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn *125 6527 *27059
modernc 229 448 30405
ncruces 192 *380 30523

Lower numbers are better. * Scorecard point awarded.

windows/386-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 967 1062 *1705
modernc 1038 1872 2287
ncruces *536 *1024 2066

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 *2641 *1219
modernc 3965 1335
ncruces 4907 1559

Lower numbers are better. * Scorecard point awarded.

windows/amd64-complex-png

Complex insert query
mattn *1542 *1379
modernc 2635 1967
ncruces 3281 2370

Lower numbers are better. * Scorecard point awarded.

windows/amd64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn 115 202 *1139
modernc *76 *175 1189
ncruces 92 198 1416

Lower numbers are better. * Scorecard point awarded.

windows/amd64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 2770 5283 *18025
modernc 962 1572 21064
ncruces *728 *1297 20409

Lower numbers are better. * Scorecard point awarded.

windows/amd64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn 2025 *3267 7007
modernc *1913 3704 *6921
ncruces 1972 3849 7802

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 *13194 *5395
modernc 22021 5721
ncruces 30627 8043

Lower numbers are better. * Scorecard point awarded.

windows/arm64-complex-png

Complex insert query
mattn *7209 *5142
modernc 12730 6866
ncruces 16475 8209

Lower numbers are better. * Scorecard point awarded.

windows/arm64-many-png

Many query/N=10 query/N=100 query/N=1000
mattn *373 *866 *5150
modernc 448 1039 5461
ncruces 626 1390 7590

Lower numbers are better. * Scorecard point awarded.

windows/arm64-large-png

Large query/N=50000 query/N=100000 query/N=200000
mattn 14620 86395 255673
modernc 6346 59425 270201
ncruces *4960 *47034 *146118

Lower numbers are better. * Scorecard point awarded.

windows/arm64-concurrent-png

Concurrent query/N=2 query/N=4 query/N=8
mattn *6598 *8161 *15807
modernc 10002 8881 17306
ncruces 12678 10624 21402

Lower numbers are better. * Scorecard point awarded.