Commit 2bf276b
committed
Optimize SQLite's complete happy path where setting
This one follows up #870 to add an optimization for job completion where
we separate out the most common case of setting jobs to `completed`
without any metadata required and update all of them in a simplified
batch query, then do the rest of the completions afterwards.
In any non-degenerate queue, most completions will be setting success
states so this should help with real world uses, but it also helps us
significantly improve SQLite's benchmarking numbers.
Here's a new benchmark run where throughput is ~4x what it was doing
before and roughly on par with Postgres:
$ go run ./cmd/river bench --database-url "sqlite://:memory:" --num-total-jobs 1_000_000
bench: jobs worked [ 0 ], inserted [ 1000000 ], job/sec [ 0.0 ] [0s]
bench: jobs worked [ 88218 ], inserted [ 0 ], job/sec [ 44109.0 ] [2s]
bench: jobs worked [ 91217 ], inserted [ 0 ], job/sec [ 45608.5 ] [2s]
bench: jobs worked [ 88858 ], inserted [ 0 ], job/sec [ 44429.0 ] [2s]
bench: jobs worked [ 77219 ], inserted [ 0 ], job/sec [ 38609.5 ] [2s]
bench: jobs worked [ 82045 ], inserted [ 0 ], job/sec [ 41022.5 ] [2s]
bench: jobs worked [ 84052 ], inserted [ 0 ], job/sec [ 42026.0 ] [2s]
bench: jobs worked [ 72028 ], inserted [ 0 ], job/sec [ 36014.0 ] [2s]
bench: jobs worked [ 90047 ], inserted [ 0 ], job/sec [ 45023.5 ] [2s]
bench: jobs worked [ 88875 ], inserted [ 0 ], job/sec [ 44437.5 ] [2s]
bench: jobs worked [ 89240 ], inserted [ 0 ], job/sec [ 44620.0 ] [2s]
bench: jobs worked [ 88842 ], inserted [ 0 ], job/sec [ 44421.0 ] [2s]
bench: jobs worked [ 59359 ], inserted [ 0 ], job/sec [ 29679.5 ] [2s]
bench: total jobs worked [ 1000000 ], total jobs inserted [ 1000000 ], overall job/sec [ 42822.8 ], running 23.35203575s
Here's a normal non-memory file-based database:
$ go run ./cmd/river bench --database-url "sqlite://./sqlite/bench.sqlite3" --num-total-jobs 1_000_000
bench: jobs worked [ 0 ], inserted [ 1000000 ], job/sec [ 0.0 ] [0s]
bench: jobs worked [ 83657 ], inserted [ 0 ], job/sec [ 41828.5 ] [2s]
bench: jobs worked [ 76648 ], inserted [ 0 ], job/sec [ 38324.0 ] [2s]
bench: jobs worked [ 88036 ], inserted [ 0 ], job/sec [ 44018.0 ] [2s]
bench: jobs worked [ 75473 ], inserted [ 0 ], job/sec [ 37736.5 ] [2s]
bench: jobs worked [ 82604 ], inserted [ 0 ], job/sec [ 41302.0 ] [2s]
bench: jobs worked [ 84048 ], inserted [ 0 ], job/sec [ 42024.0 ] [2s]
bench: jobs worked [ 85508 ], inserted [ 0 ], job/sec [ 42754.0 ] [2s]
bench: jobs worked [ 90580 ], inserted [ 0 ], job/sec [ 45290.0 ] [2s]
bench: jobs worked [ 83568 ], inserted [ 0 ], job/sec [ 41784.0 ] [2s]
bench: jobs worked [ 86062 ], inserted [ 0 ], job/sec [ 43031.0 ] [2s]
bench: jobs worked [ 88508 ], inserted [ 0 ], job/sec [ 44254.0 ] [2s]
bench: jobs worked [ 75308 ], inserted [ 0 ], job/sec [ 37654.0 ] [2s]
bench: total jobs worked [ 1000000 ], total jobs inserted [ 1000000 ], overall job/sec [ 42331.9 ], running 23.622860125s
The improved benchmarks only work for fixed job burndown mode (with the
`--num-total-jobs` option) because inserting jobs is still pretty slow
because it's still done one by one.
Once again, I'm pretty sure I'll be able to land some SQLite fixes
that'll make batch operations possible using `json_each`, and then we
should be able to make all normal operations batch-wise. That'll take
some time though, and we can get this optimization out in time for the
initial SQLite release.completed without metadata1 parent aeaba05 commit 2bf276b
File tree
4 files changed
+141
-6
lines changed- internal/riverinternaltest/riverdrivertest
- riverdriver/riversqlite
- internal/dbsqlc
4 files changed
+141
-6
lines changedLines changed: 2 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2261 | 2261 | | |
2262 | 2262 | | |
2263 | 2263 | | |
2264 | | - | |
| 2264 | + | |
2265 | 2265 | | |
2266 | 2266 | | |
2267 | 2267 | | |
| |||
2274 | 2274 | | |
2275 | 2275 | | |
2276 | 2276 | | |
2277 | | - | |
| 2277 | + | |
2278 | 2278 | | |
2279 | 2279 | | |
2280 | 2280 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
380 | 380 | | |
381 | 381 | | |
382 | 382 | | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
383 | 393 | | |
384 | 394 | | |
385 | 395 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
15 | | - | |
16 | | - | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| |||
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
| 43 | + | |
43 | 44 | | |
44 | 45 | | |
45 | 46 | | |
| |||
683 | 684 | | |
684 | 685 | | |
685 | 686 | | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + | |
| 692 | + | |
| 693 | + | |
| 694 | + | |
| 695 | + | |
| 696 | + | |
| 697 | + | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
| 705 | + | |
| 706 | + | |
| 707 | + | |
| 708 | + | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
686 | 737 | | |
687 | | - | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + | |
| 743 | + | |
688 | 744 | | |
689 | 745 | | |
690 | 746 | | |
| |||
0 commit comments