aboutsummaryrefslogtreecommitdiffstats
path: root/research
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-30 07:56:49 +0100
committereunhhu <[email protected]>2026-09-30 07:56:49 +0100
commit0a57c3ad03df6da7eb0a72059bd85c4d716dbb8a (patch)
tree59fd8e42bd64d36ee152bc4f7fab8e3f6d771672 /research
parent49c5b0cb8205509ed602d5e6a71ec4edd7b0387f (diff)
downloadpure-0a57c3ad03df6da7eb0a72059bd85c4d716dbb8a.tar.gz
pure-0a57c3ad03df6da7eb0a72059bd85c4d716dbb8a.zip
Say what TPC-C costs when SQLite commits in groups too, and with four warehouses (106)
SQLite tuned first, by the criteria committed before (and, beyond them, checkpoints each 40 MB of WAL, in its favour). On the SD card Pure stays 4.2-10.8x ahead at equal terminals, SQLite writing 8-18x the bytes a transaction; in RAM 3.2-3.5x. All tables equal at W=1 and W=4, and every run consistent. In RAM the one owner is the limit (0.94 of a core at W=4, no gain from 16 to 64 terminals), a third of its busy time copying nodes the snapshots share; checkpoints and memory are within their criteria.
Diffstat (limited to 'research')
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-owner-run-linux-aarch64.jsonl3
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-owner-stacks-linux-aarch64.txt80
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-ram-w1-linux-aarch64.jsonl9
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-ram-w4-linux-aarch64.jsonl9
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-sd-w1-1-linux-aarch64.jsonl8
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-sd-w1-2-linux-aarch64.jsonl8
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-sd-w1-3-linux-aarch64.jsonl8
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-sd-w4-1-linux-aarch64.jsonl8
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-sd-w4-2-linux-aarch64.jsonl8
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-sd-w4-3-linux-aarch64.jsonl8
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-tune-ram-checkpoint10000-linux-aarch64.jsonl6
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-tune-ram-defaults-linux-aarch64.jsonl6
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-tune-ram-tuned-linux-aarch64.jsonl6
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-tune-sd-page1024-checkpoint40000-linux-aarch64.jsonl5
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-tune-sd-page1024-linux-aarch64.jsonl5
-rw-r--r--research/experiments/022-tpcc-grouped/2026-09-30-tune-sd-page4096-linux-aarch64.jsonl5
-rw-r--r--research/experiments/022-tpcc-grouped/owner-samples.py72
-rw-r--r--research/experiments/022-tpcc-grouped/runs.sh45
-rw-r--r--research/experiments/022-tpcc-grouped/tables.py73
19 files changed, 372 insertions, 0 deletions
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-owner-run-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-owner-run-linux-aarch64.jsonl
new file mode 100644
index 0000000..68897c0
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-owner-run-linux-aarch64.jsonl
@@ -0,0 +1,3 @@
+{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.57, "pure_load_s": 0.72, "sqlite_load_s": 1.59, "sqlite_page_size": 4096, "pure_resident_mib": 38.1, "sqlite_file_mib": 13.8}
+{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 33376, "new_orders_per_minute": 891806, "undone_new_orders": 13427, "errors": 0, "new_order": {"done": 1351136, "failed": 0, "p50_us": 1792, "p99_us": 5376}, "payment": {"done": 1292445, "failed": 0, "p50_us": 1792, "p99_us": 5376}, "order_status": {"done": 119936, "failed": 0, "p50_us": 288, "p99_us": 2688}, "delivery": {"done": 119938, "failed": 0, "p50_us": 1792, "p99_us": 5376}, "stock_level": {"done": 120359, "failed": 0, "p50_us": 320, "p99_us": 3072}, "server_threads": "3", "cpu_us_per_transaction": 51.3, "core_shares": {"pure-owner": 0.85, "pure-checkpoint": 0.02}, "resident_mib": 1625.9, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 1658.0, "pure_state_mib": 744.8, "pure_store_mib": 788.5, "sqlite_files_mib": 13.8, "grouped_sqlite_files_mib": 0.0, "pure_counts": {"bursts": 92178, "burst_events": 2750176, "checkpoints": 141}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-owner-stacks-linux-aarch64.txt b/research/experiments/022-tpcc-grouped/2026-09-30-owner-stacks-linux-aarch64.txt
new file mode 100644
index 0000000..eefecda
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-owner-stacks-linux-aarch64.txt
@@ -0,0 +1,80 @@
+?? < ?? < ?? < pthread_cond_timedwait < run_owner < ?? < ??
+upper < pure_list_seek < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < malloc < new_node < own < descend < pure_list_set < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_wait < run_owner < ?? < ??
+descend < pure_list_set < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < own < descend < pure_list_set < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+child_at < descend < prepare < pure_list_insert < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+decode_cell < decode_item < pure_list_read < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+upper < pure_list_seek < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < ?? < free < pure_retired_free < pure_snapshot_release < pure_snapshot_release < publish < after_save < save_burst < save_burst < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < hand_back < execute < execute < run_owner < ?? < ??
+run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+pure_list_seek < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+pure_app_save < save_burst < save_burst < execute < execute < run_owner < ?? < ??
+lower < pure_list_seek < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+cell_at < cell_at < pure_list_get < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+pure_list_seek < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < realloc < retire < own < descend < pure_list_set < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+decode_item < pure_list_read < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_timedwait < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_timedwait < run_owner < ?? < ??
+child < leaf_of < pure_list_get < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < hand_back < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < free < pure_retired_free < pure_snapshot_release < pure_snapshot_release < publish < after_save < save_burst < save_burst < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_timedwait < run_owner < ?? < ??
+pure_list_seek < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < malloc < new_node < own < descend < prepare < pure_list_insert < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+lower < pure_list_seek < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_timedwait < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_timedwait < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_timedwait < run_owner < ?? < ??
+?? < pthread_mutex_lock < run_owner < ?? < ??
+decode_item < pure_list_read < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < own < descend < pure_list_set < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < malloc < new_node < own < descend < pure_list_set < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < ?? < free < pure_retired_free < pure_snapshot_release < pure_snapshot_release < publish < after_save < save_burst < save_burst < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_wait < run_owner < ?? < ??
+pure_retired_pass < pure_save_snapshot < pure_app_snapshot < publish < after_save < save_burst < save_burst < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_timedwait < run_owner < ?? < ??
+child_at < descend < prepare < pure_list_insert < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < free < pure_retired_free < pure_snapshot_release < pure_snapshot_release < publish < after_save < save_burst < save_burst < execute < execute < run_owner < ?? < ??
+?? < ?? < malloc < new_node < own < descend < pure_list_set < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_wait < run_owner < ?? < ??
+lower < pure_list_seek < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < malloc < new_node < prepare < pure_list_insert < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+upper < pure_list_seek < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < malloc < new_node < own < descend < pure_list_set < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_wait < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_timedwait < run_owner < ?? < ??
+run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+new_node < prepare < pure_list_insert < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < malloc < new_node < own < descend < prepare < pure_list_insert < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+sum < sum < sum_path < sum_path < place < pure_list_insert < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < malloc < new_node < prepare < pure_list_insert < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+pure_list_seek < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < hand_back < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_wait < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_timedwait < run_owner < ?? < ??
+upper < pure_list_seek < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+pure_list_seek < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+pure_list_seek < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+pure_list_seek < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_wait < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_wait < run_owner < ?? < ??
+pure_list_seek < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_timedwait < run_owner < ?? < ??
+upper < pure_list_seek < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+pure_list_seek < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+fstatat64 < refresh < pure_store_pin < execute < execute < run_owner < ?? < ??
+?? < own < descend < pure_list_set < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+child < sum_path < sum_path < place < pure_list_insert < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < own < descend < pure_list_set < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+pure_list_seek < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+descend < pure_list_set < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+child_at < descend < pure_list_set < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+malloc < new_node < own < descend < pure_list_set < run < run < dispatch < message < pure_app_message_fields < apply_input < apply_effect < execute < execute < run_owner < ?? < ??
+?? < ?? < ?? < pthread_cond_wait < run_owner < ?? < ??
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-ram-w1-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-ram-w1-linux-aarch64.jsonl
new file mode 100644
index 0000000..32fcc21
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-ram-w1-linux-aarch64.jsonl
@@ -0,0 +1,9 @@
+{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 0.73, "sqlite_load_s": 1.59, "sqlite_page_size": 4096, "pure_resident_mib": 38.1, "sqlite_file_mib": 13.8}
+{"step": "same transactions", "transactions": 20000, "pure": {"new_order": 9036, "payment": 8518, "order_status": 811, "delivery": 796, "stock_level": 839}, "sqlite": {"new_order": 9036, "payment": 8518, "order_status": 811, "delivery": 796, "stock_level": 839}, "undone_new_orders": [90, 90], "failed": [0, 0], "differing": {}, "grouped_sqlite_differing": {}, "consistency_failures": []}
+{"step": "run", "system": "pure", "warehouses": 1, "terminals": 16, "transactions_per_second": 35672, "new_orders_per_minute": 954531, "undone_new_orders": 3263, "errors": 0, "new_order": {"done": 321442, "failed": 0, "p50_us": 464, "p99_us": 1088}, "payment": {"done": 306457, "failed": 0, "p50_us": 432, "p99_us": 1024}, "order_status": {"done": 28612, "failed": 0, "p50_us": 96, "p99_us": 496}, "delivery": {"done": 28480, "failed": 0, "p50_us": 432, "p99_us": 992}, "stock_level": {"done": 28445, "failed": 0, "p50_us": 152, "p99_us": 512}, "server_threads": "3", "cpu_us_per_transaction": 45.6, "core_shares": {"pure-owner": 0.83, "pure-checkpoint": 0.02}, "resident_mib": 439.0, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 36567, "new_orders_per_minute": 977959, "undone_new_orders": 3138, "errors": 0, "new_order": {"done": 329127, "failed": 0, "p50_us": 1728, "p99_us": 4352}, "payment": {"done": 314476, "failed": 0, "p50_us": 1728, "p99_us": 4352}, "order_status": {"done": 29356, "failed": 0, "p50_us": 256, "p99_us": 2176}, "delivery": {"done": 29316, "failed": 0, "p50_us": 1728, "p99_us": 4352}, "stock_level": {"done": 29068, "failed": 0, "p50_us": 304, "p99_us": 2176}, "server_threads": "3", "cpu_us_per_transaction": 48.9, "core_shares": {"pure-owner": 0.9, "pure-checkpoint": 0.01}, "resident_mib": 835.0, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=10000;", "warehouses": 1, "terminals": 1, "transactions_per_second": 10357, "batches": 0, "batched": 0, "new_orders_per_minute": 277623, "undone_new_orders": 984, "new_order": {"done": 93553, "failed": 0, "p50_us": 144, "p99_us": 248}, "payment": {"done": 88827, "failed": 0, "p50_us": 24, "p99_us": 42}, "order_status": {"done": 8229, "failed": 0, "p50_us": 16, "p99_us": 29}, "delivery": {"done": 8365, "failed": 0, "p50_us": 56, "p99_us": 384}, "stock_level": {"done": 8232, "failed": 0, "p50_us": 256, "p99_us": 368}, "cpu_seconds": 19.988, "peak_resident_kib": 101504, "written_bytes": 0, "cpu_us_per_transaction": 96.5, "peak_resident_mib": 99.1, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=10000;", "warehouses": 1, "terminals": 4, "transactions_per_second": 10219, "batches": 0, "batched": 0, "new_orders_per_minute": 273662, "undone_new_orders": 982, "new_order": {"done": 92610, "failed": 0, "p50_us": 152, "p99_us": 256}, "payment": {"done": 88112, "failed": 0, "p50_us": 24, "p99_us": 44}, "order_status": {"done": 8202, "failed": 0, "p50_us": 19, "p99_us": 36}, "delivery": {"done": 8253, "failed": 0, "p50_us": 56, "p99_us": 120}, "stock_level": {"done": 8111, "failed": 0, "p50_us": 256, "p99_us": 512}, "cpu_seconds": 20.198, "peak_resident_kib": 41600, "written_bytes": 0, "cpu_us_per_transaction": 98.4, "peak_resident_mib": 40.6, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=10000;", "warehouses": 1, "terminals": 16, "transactions_per_second": 9843, "batches": 15592, "batched": 181250, "new_orders_per_minute": 263618, "undone_new_orders": 887, "new_order": {"done": 88807, "failed": 0, "p50_us": 1600, "p99_us": 4352}, "payment": {"done": 84493, "failed": 0, "p50_us": 1472, "p99_us": 4096}, "order_status": {"done": 7944, "failed": 0, "p50_us": 128, "p99_us": 864}, "delivery": {"done": 7950, "failed": 0, "p50_us": 1536, "p99_us": 4096}, "stock_level": {"done": 7776, "failed": 0, "p50_us": 704, "p99_us": 1792}, "cpu_seconds": 26.387, "peak_resident_kib": 78832, "written_bytes": 0, "cpu_us_per_transaction": 134.0, "peak_resident_mib": 77.0, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=10000;", "warehouses": 1, "terminals": 64, "transactions_per_second": 10271, "batches": 3786, "batched": 189637, "new_orders_per_minute": 274098, "undone_new_orders": 889, "new_order": {"done": 92597, "failed": 0, "p50_us": 5888, "p99_us": 12288}, "payment": {"done": 88763, "failed": 0, "p50_us": 5632, "p99_us": 12288}, "order_status": {"done": 8349, "failed": 0, "p50_us": 232, "p99_us": 1600}, "delivery": {"done": 8277, "failed": 0, "p50_us": 5632, "p99_us": 12288}, "stock_level": {"done": 8195, "failed": 0, "p50_us": 1088, "p99_us": 3328}, "cpu_seconds": 27.052, "peak_resident_kib": 127264, "written_bytes": 0, "cpu_us_per_transaction": 131.2, "peak_resident_mib": 124.3, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 835.0, "pure_state_mib": 374.8, "pure_store_mib": 434.4, "sqlite_files_mib": 84.0, "grouped_sqlite_files_mib": 82.2, "pure_counts": {"bursts": 121457, "burst_events": 1341257, "checkpoints": 71}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-ram-w4-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-ram-w4-linux-aarch64.jsonl
new file mode 100644
index 0000000..2168ba5
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-ram-w4-linux-aarch64.jsonl
@@ -0,0 +1,9 @@
+{"step": "load", "directory": "/dev/shm", "warehouses": 4, "rows": 1975536, "generate_s": 2.01, "pure_load_s": 2.62, "sqlite_load_s": 6.01, "sqlite_page_size": 4096, "pure_resident_mib": 104.1, "sqlite_file_mib": 52.8}
+{"step": "same transactions", "transactions": 20000, "pure": {"new_order": 8875, "payment": 8786, "order_status": 777, "delivery": 777, "stock_level": 785}, "sqlite": {"new_order": 8875, "payment": 8786, "order_status": 777, "delivery": 777, "stock_level": 785}, "undone_new_orders": [93, 93], "failed": [0, 0], "differing": {}, "grouped_sqlite_differing": {}, "consistency_failures": []}
+{"step": "run", "system": "pure", "warehouses": 4, "terminals": 16, "transactions_per_second": 32765, "new_orders_per_minute": 875580, "undone_new_orders": 2931, "errors": 0, "new_order": {"done": 294794, "failed": 0, "p50_us": 512, "p99_us": 992}, "payment": {"done": 281257, "failed": 0, "p50_us": 480, "p99_us": 928}, "order_status": {"done": 26602, "failed": 0, "p50_us": 84, "p99_us": 480}, "delivery": {"done": 26342, "failed": 0, "p50_us": 496, "p99_us": 928}, "stock_level": {"done": 26305, "failed": 0, "p50_us": 152, "p99_us": 512}, "server_threads": "3", "cpu_us_per_transaction": 48.1, "core_shares": {"pure-owner": 0.86, "pure-checkpoint": 0.01}, "resident_mib": 489.5, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "pure", "warehouses": 4, "terminals": 64, "transactions_per_second": 32255, "new_orders_per_minute": 861888, "undone_new_orders": 2861, "errors": 0, "new_order": {"done": 290157, "failed": 0, "p50_us": 2048, "p99_us": 3584}, "payment": {"done": 277741, "failed": 0, "p50_us": 2048, "p99_us": 3584}, "order_status": {"done": 25824, "failed": 0, "p50_us": 256, "p99_us": 1280}, "delivery": {"done": 25767, "failed": 0, "p50_us": 2048, "p99_us": 3584}, "stock_level": {"done": 25609, "failed": 0, "p50_us": 304, "p99_us": 1408}, "server_threads": "3", "cpu_us_per_transaction": 53.9, "core_shares": {"pure-owner": 0.94, "pure-checkpoint": 0.01}, "resident_mib": 846.4, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=10000;", "warehouses": 4, "terminals": 1, "transactions_per_second": 10272, "batches": 0, "batched": 0, "new_orders_per_minute": 274858, "undone_new_orders": 955, "new_order": {"done": 92607, "failed": 0, "p50_us": 144, "p99_us": 240}, "payment": {"done": 88252, "failed": 0, "p50_us": 25, "p99_us": 40}, "order_status": {"done": 8196, "failed": 0, "p50_us": 16, "p99_us": 27}, "delivery": {"done": 8200, "failed": 0, "p50_us": 56, "p99_us": 416}, "stock_level": {"done": 8258, "failed": 0, "p50_us": 256, "p99_us": 368}, "cpu_seconds": 19.953, "peak_resident_kib": 118560, "written_bytes": 0, "cpu_us_per_transaction": 97.1, "peak_resident_mib": 115.8, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=10000;", "warehouses": 4, "terminals": 4, "transactions_per_second": 9780, "batches": 0, "batched": 0, "new_orders_per_minute": 261003, "undone_new_orders": 824, "new_order": {"done": 88102, "failed": 0, "p50_us": 152, "p99_us": 288}, "payment": {"done": 84541, "failed": 0, "p50_us": 25, "p99_us": 52}, "order_status": {"done": 7899, "failed": 0, "p50_us": 19, "p99_us": 38}, "delivery": {"done": 7831, "failed": 0, "p50_us": 58, "p99_us": 128}, "stock_level": {"done": 7844, "failed": 0, "p50_us": 272, "p99_us": 608}, "cpu_seconds": 20.395, "peak_resident_kib": 61888, "written_bytes": 0, "cpu_us_per_transaction": 103.9, "peak_resident_mib": 60.4, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=10000;", "warehouses": 4, "terminals": 16, "transactions_per_second": 8828, "batches": 13992, "batched": 162505, "new_orders_per_minute": 236816, "undone_new_orders": 807, "new_order": {"done": 79796, "failed": 0, "p50_us": 1728, "p99_us": 8192}, "payment": {"done": 75485, "failed": 0, "p50_us": 1600, "p99_us": 7936}, "order_status": {"done": 7088, "failed": 0, "p50_us": 136, "p99_us": 928}, "delivery": {"done": 7224, "failed": 0, "p50_us": 1664, "p99_us": 8192}, "stock_level": {"done": 7088, "failed": 0, "p50_us": 736, "p99_us": 1984}, "cpu_seconds": 26.015, "peak_resident_kib": 116656, "written_bytes": 0, "cpu_us_per_transaction": 147.2, "peak_resident_mib": 113.9, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=10000;", "warehouses": 4, "terminals": 64, "transactions_per_second": 8876, "batches": 3230, "batched": 164115, "new_orders_per_minute": 238430, "undone_new_orders": 773, "new_order": {"done": 80502, "failed": 0, "p50_us": 6656, "p99_us": 17408}, "payment": {"done": 76519, "failed": 0, "p50_us": 6400, "p99_us": 17408}, "order_status": {"done": 6990, "failed": 0, "p50_us": 248, "p99_us": 1920}, "delivery": {"done": 7094, "failed": 0, "p50_us": 6400, "p99_us": 17408}, "stock_level": {"done": 6986, "failed": 0, "p50_us": 1152, "p99_us": 3584}, "cpu_seconds": 26.239, "peak_resident_kib": 192816, "written_bytes": 0, "cpu_us_per_transaction": 147.3, "peak_resident_mib": 188.3, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 846.4, "pure_state_mib": 402.1, "pure_store_mib": 410.7, "sqlite_files_mib": 123.7, "grouped_sqlite_files_mib": 117.9, "pure_counts": {"bursts": 111218, "burst_events": 1208752, "checkpoints": 28}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-sd-w1-1-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-sd-w1-1-linux-aarch64.jsonl
new file mode 100644
index 0000000..6882fc1
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-sd-w1-1-linux-aarch64.jsonl
@@ -0,0 +1,8 @@
+{"step": "load", "directory": "/home/eunhhu/tpcc-sd", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 1.34, "sqlite_load_s": 1.72, "sqlite_page_size": 1024, "pure_resident_mib": 38.1, "sqlite_file_mib": 13.8}
+{"step": "run", "system": "pure", "warehouses": 1, "terminals": 16, "transactions_per_second": 2672, "new_orders_per_minute": 71361, "undone_new_orders": 368, "errors": 0, "new_order": {"done": 36109, "failed": 0, "p50_us": 4864, "p99_us": 36864}, "payment": {"done": 34444, "failed": 0, "p50_us": 4864, "p99_us": 38912}, "order_status": {"done": 3282, "failed": 0, "p50_us": 128, "p99_us": 448}, "delivery": {"done": 3283, "failed": 0, "p50_us": 4864, "p99_us": 36864}, "stock_level": {"done": 3190, "failed": 0, "p50_us": 192, "p99_us": 512}, "server_threads": "3", "cpu_us_per_transaction": 58.5, "core_shares": {"pure-owner": 0.09, "pure-checkpoint": 0.0}, "resident_mib": 79.3, "written_bytes_per_transaction": 1303.4, "device_bytes_per_transaction": 1298.1, "consistency_failures": []}
+{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 6083, "new_orders_per_minute": 162380, "undone_new_orders": 789, "errors": 0, "new_order": {"done": 81987, "failed": 0, "p50_us": 7680, "p99_us": 73728}, "payment": {"done": 78571, "failed": 0, "p50_us": 7680, "p99_us": 73728}, "order_status": {"done": 7386, "failed": 0, "p50_us": 336, "p99_us": 928}, "delivery": {"done": 7322, "failed": 0, "p50_us": 7680, "p99_us": 73728}, "stock_level": {"done": 7251, "failed": 0, "p50_us": 400, "p99_us": 1024}, "server_threads": "3", "cpu_us_per_transaction": 51.1, "core_shares": {"pure-owner": 0.16, "pure-checkpoint": 0.0}, "resident_mib": 178.7, "written_bytes_per_transaction": 667.4, "device_bytes_per_transaction": 682.8, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 1, "transactions_per_second": 110, "batches": 0, "batched": 0, "new_orders_per_minute": 3014, "undone_new_orders": 7, "new_order": {"done": 1514, "failed": 0, "p50_us": 6144, "p99_us": 69632}, "payment": {"done": 1379, "failed": 0, "p50_us": 4352, "p99_us": 73728}, "order_status": {"done": 119, "failed": 0, "p50_us": 40, "p99_us": 104}, "delivery": {"done": 151, "failed": 0, "p50_us": 4352, "p99_us": 57344}, "stock_level": {"done": 136, "failed": 0, "p50_us": 496, "p99_us": 672}, "cpu_seconds": 0.724, "peak_resident_kib": 17168, "written_bytes": 88211456, "cpu_us_per_transaction": 219.5, "peak_resident_mib": 16.8, "written_bytes_per_transaction": 26738.8, "device_bytes_per_transaction": 38881.6, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 4, "transactions_per_second": 267, "batches": 0, "batched": 0, "new_orders_per_minute": 7041, "undone_new_orders": 48, "new_order": {"done": 3579, "failed": 0, "p50_us": 1792, "p99_us": 77824}, "payment": {"done": 3505, "failed": 0, "p50_us": 1216, "p99_us": 26624}, "order_status": {"done": 313, "failed": 0, "p50_us": 32, "p99_us": 68}, "delivery": {"done": 325, "failed": 0, "p50_us": 1344, "p99_us": 55296}, "stock_level": {"done": 307, "failed": 0, "p50_us": 416, "p99_us": 736}, "cpu_seconds": 1.293, "peak_resident_kib": 24096, "written_bytes": 231292928, "cpu_us_per_transaction": 161.0, "peak_resident_mib": 23.5, "written_bytes_per_transaction": 28807.2, "device_bytes_per_transaction": 18109.8, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 16, "transactions_per_second": 505, "batches": 1159, "batched": 13931, "new_orders_per_minute": 13534, "undone_new_orders": 63, "new_order": {"done": 6834, "failed": 0, "p50_us": 9216, "p99_us": 475136}, "payment": {"done": 6471, "failed": 0, "p50_us": 8704, "p99_us": 425984}, "order_status": {"done": 608, "failed": 0, "p50_us": 136, "p99_us": 960}, "delivery": {"done": 626, "failed": 0, "p50_us": 8704, "p99_us": 425984}, "stock_level": {"done": 610, "failed": 0, "p50_us": 768, "p99_us": 1856}, "cpu_seconds": 2.369, "peak_resident_kib": 45968, "written_bytes": 173047808, "cpu_us_per_transaction": 156.4, "peak_resident_mib": 44.9, "written_bytes_per_transaction": 11423.1, "device_bytes_per_transaction": 10877.7, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 64, "transactions_per_second": 739, "batches": 421, "batched": 21294, "new_orders_per_minute": 19581, "undone_new_orders": 92, "new_order": {"done": 10346, "failed": 0, "p50_us": 19456, "p99_us": 1245184}, "payment": {"done": 10010, "failed": 0, "p50_us": 18432, "p99_us": 1179648}, "order_status": {"done": 963, "failed": 0, "p50_us": 224, "p99_us": 2048}, "delivery": {"done": 938, "failed": 0, "p50_us": 19456, "p99_us": 1179648}, "stock_level": {"done": 961, "failed": 0, "p50_us": 1024, "p99_us": 3840}, "cpu_seconds": 3.434, "peak_resident_kib": 90976, "written_bytes": 184401920, "cpu_us_per_transaction": 147.9, "peak_resident_mib": 88.8, "written_bytes_per_transaction": 7942.2, "device_bytes_per_transaction": 7647.2, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 178.7, "pure_state_mib": 85.4, "pure_store_mib": 86.7, "sqlite_files_mib": 15.7, "grouped_sqlite_files_mib": 20.2, "pure_counts": {"bursts": 7882, "burst_events": 240657, "checkpoints": 12}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-sd-w1-2-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-sd-w1-2-linux-aarch64.jsonl
new file mode 100644
index 0000000..00479ae
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-sd-w1-2-linux-aarch64.jsonl
@@ -0,0 +1,8 @@
+{"step": "load", "directory": "/home/eunhhu/tpcc-sd", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 4.8, "sqlite_load_s": 1.76, "sqlite_page_size": 1024, "pure_resident_mib": 38.1, "sqlite_file_mib": 13.8}
+{"step": "run", "system": "pure", "warehouses": 1, "terminals": 16, "transactions_per_second": 2136, "new_orders_per_minute": 57148, "undone_new_orders": 275, "errors": 0, "new_order": {"done": 28855, "failed": 0, "p50_us": 5376, "p99_us": 59392}, "payment": {"done": 27433, "failed": 0, "p50_us": 5120, "p99_us": 59392}, "order_status": {"done": 2608, "failed": 0, "p50_us": 124, "p99_us": 400}, "delivery": {"done": 2641, "failed": 0, "p50_us": 5376, "p99_us": 61440}, "stock_level": {"done": 2544, "failed": 0, "p50_us": 176, "p99_us": 480}, "server_threads": "3", "cpu_us_per_transaction": 58.5, "core_shares": {"pure-owner": 0.07, "pure-checkpoint": 0.0}, "resident_mib": 74.8, "written_bytes_per_transaction": 1317.2, "device_bytes_per_transaction": 1324.3, "consistency_failures": []}
+{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 4980, "new_orders_per_minute": 132962, "undone_new_orders": 660, "errors": 0, "new_order": {"done": 67234, "failed": 0, "p50_us": 8192, "p99_us": 110592}, "payment": {"done": 64321, "failed": 0, "p50_us": 8192, "p99_us": 102400}, "order_status": {"done": 6100, "failed": 0, "p50_us": 384, "p99_us": 928}, "delivery": {"done": 5996, "failed": 0, "p50_us": 8192, "p99_us": 110592}, "stock_level": {"done": 5954, "failed": 0, "p50_us": 416, "p99_us": 992}, "server_threads": "3", "cpu_us_per_transaction": 54.7, "core_shares": {"pure-owner": 0.14, "pure-checkpoint": 0.0}, "resident_mib": 152.1, "written_bytes_per_transaction": 628.8, "device_bytes_per_transaction": 650.5, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 1, "transactions_per_second": 124, "batches": 0, "batched": 0, "new_orders_per_minute": 3361, "undone_new_orders": 10, "new_order": {"done": 1691, "failed": 0, "p50_us": 5376, "p99_us": 86016}, "payment": {"done": 1569, "failed": 0, "p50_us": 4352, "p99_us": 57344}, "order_status": {"done": 131, "failed": 0, "p50_us": 40, "p99_us": 96}, "delivery": {"done": 169, "failed": 0, "p50_us": 4608, "p99_us": 57344}, "stock_level": {"done": 150, "failed": 0, "p50_us": 432, "p99_us": 672}, "cpu_seconds": 0.787, "peak_resident_kib": 18176, "written_bytes": 103907328, "cpu_us_per_transaction": 212.1, "peak_resident_mib": 17.8, "written_bytes_per_transaction": 28007.4, "device_bytes_per_transaction": 39382.3, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 4, "transactions_per_second": 293, "batches": 0, "batched": 0, "new_orders_per_minute": 7845, "undone_new_orders": 37, "new_order": {"done": 3980, "failed": 0, "p50_us": 1792, "p99_us": 73728}, "payment": {"done": 3776, "failed": 0, "p50_us": 1216, "p99_us": 24576}, "order_status": {"done": 353, "failed": 0, "p50_us": 31, "p99_us": 72}, "delivery": {"done": 361, "failed": 0, "p50_us": 1344, "p99_us": 55296}, "stock_level": {"done": 355, "failed": 0, "p50_us": 384, "p99_us": 704}, "cpu_seconds": 1.371, "peak_resident_kib": 20336, "written_bytes": 246743040, "cpu_us_per_transaction": 155.4, "peak_resident_mib": 19.9, "written_bytes_per_transaction": 27959.6, "device_bytes_per_transaction": 16439.2, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 16, "transactions_per_second": 485, "batches": 1094, "batched": 13397, "new_orders_per_minute": 13014, "undone_new_orders": 62, "new_order": {"done": 6572, "failed": 0, "p50_us": 9728, "p99_us": 491520}, "payment": {"done": 6217, "failed": 0, "p50_us": 9216, "p99_us": 458752}, "order_status": {"done": 589, "failed": 0, "p50_us": 136, "p99_us": 992}, "delivery": {"done": 608, "failed": 0, "p50_us": 8704, "p99_us": 458752}, "stock_level": {"done": 577, "failed": 0, "p50_us": 736, "p99_us": 1792}, "cpu_seconds": 2.189, "peak_resident_kib": 41536, "written_bytes": 165167104, "cpu_us_per_transaction": 150.3, "peak_resident_mib": 40.6, "written_bytes_per_transaction": 11341.6, "device_bytes_per_transaction": 10802.7, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 64, "transactions_per_second": 853, "batches": 467, "batched": 23885, "new_orders_per_minute": 22699, "undone_new_orders": 105, "new_order": {"done": 11647, "failed": 0, "p50_us": 34816, "p99_us": 1245184}, "payment": {"done": 11199, "failed": 0, "p50_us": 27648, "p99_us": 1179648}, "order_status": {"done": 1083, "failed": 0, "p50_us": 208, "p99_us": 2048}, "delivery": {"done": 1039, "failed": 0, "p50_us": 22528, "p99_us": 1114112}, "stock_level": {"done": 1066, "failed": 0, "p50_us": 1024, "p99_us": 3712}, "cpu_seconds": 3.705, "peak_resident_kib": 91552, "written_bytes": 204521472, "cpu_us_per_transaction": 142.3, "peak_resident_mib": 89.4, "written_bytes_per_transaction": 7855.9, "device_bytes_per_transaction": 7522.4, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 152.1, "pure_state_mib": 73.7, "pure_store_mib": 69.9, "sqlite_files_mib": 15.9, "grouped_sqlite_files_mib": 20.5, "pure_counts": {"bursts": 6298, "burst_events": 195640, "checkpoints": 8}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-sd-w1-3-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-sd-w1-3-linux-aarch64.jsonl
new file mode 100644
index 0000000..d452cc1
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-sd-w1-3-linux-aarch64.jsonl
@@ -0,0 +1,8 @@
+{"step": "load", "directory": "/home/eunhhu/tpcc-sd", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 1.22, "sqlite_load_s": 1.75, "sqlite_page_size": 1024, "pure_resident_mib": 38.1, "sqlite_file_mib": 13.8}
+{"step": "run", "system": "pure", "warehouses": 1, "terminals": 16, "transactions_per_second": 2138, "new_orders_per_minute": 57206, "undone_new_orders": 274, "errors": 0, "new_order": {"done": 28882, "failed": 0, "p50_us": 5376, "p99_us": 59392}, "payment": {"done": 27466, "failed": 0, "p50_us": 5120, "p99_us": 59392}, "order_status": {"done": 2617, "failed": 0, "p50_us": 124, "p99_us": 416}, "delivery": {"done": 2644, "failed": 0, "p50_us": 5120, "p99_us": 61440}, "stock_level": {"done": 2551, "failed": 0, "p50_us": 192, "p99_us": 512}, "server_threads": "3", "cpu_us_per_transaction": 61.6, "core_shares": {"pure-owner": 0.07, "pure-checkpoint": 0.0}, "resident_mib": 74.8, "written_bytes_per_transaction": 1321.0, "device_bytes_per_transaction": 1328.6, "consistency_failures": []}
+{"step": "run", "system": "pure", "warehouses": 1, "terminals": 64, "transactions_per_second": 4864, "new_orders_per_minute": 130098, "undone_new_orders": 641, "errors": 0, "new_order": {"done": 65699, "failed": 0, "p50_us": 8704, "p99_us": 77824}, "payment": {"done": 62652, "failed": 0, "p50_us": 8704, "p99_us": 77824}, "order_status": {"done": 5933, "failed": 0, "p50_us": 400, "p99_us": 960}, "delivery": {"done": 5825, "failed": 0, "p50_us": 8704, "p99_us": 73728}, "stock_level": {"done": 5817, "failed": 0, "p50_us": 448, "p99_us": 1024}, "server_threads": "3", "cpu_us_per_transaction": 56.4, "core_shares": {"pure-owner": 0.14, "pure-checkpoint": 0.0}, "resident_mib": 150.1, "written_bytes_per_transaction": 715.6, "device_bytes_per_transaction": 680.0, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 1, "transactions_per_second": 96, "batches": 0, "batched": 0, "new_orders_per_minute": 2652, "undone_new_orders": 7, "new_order": {"done": 1333, "failed": 0, "p50_us": 6144, "p99_us": 94208}, "payment": {"done": 1197, "failed": 0, "p50_us": 4352, "p99_us": 65536}, "order_status": {"done": 106, "failed": 0, "p50_us": 40, "p99_us": 68}, "delivery": {"done": 129, "failed": 0, "p50_us": 4352, "p99_us": 65536}, "stock_level": {"done": 118, "failed": 0, "p50_us": 416, "p99_us": 640}, "cpu_seconds": 0.585, "peak_resident_kib": 17072, "written_bytes": 77168640, "cpu_us_per_transaction": 202.9, "peak_resident_mib": 16.7, "written_bytes_per_transaction": 26766.8, "device_bytes_per_transaction": 38982.3, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 4, "transactions_per_second": 152, "batches": 0, "batched": 0, "new_orders_per_minute": 4090, "undone_new_orders": 24, "new_order": {"done": 2130, "failed": 0, "p50_us": 2048, "p99_us": 114688}, "payment": {"done": 2016, "failed": 0, "p50_us": 1536, "p99_us": 57344}, "order_status": {"done": 187, "failed": 0, "p50_us": 38, "p99_us": 116}, "delivery": {"done": 174, "failed": 0, "p50_us": 1664, "p99_us": 57344}, "stock_level": {"done": 180, "failed": 0, "p50_us": 464, "p99_us": 832}, "cpu_seconds": 0.952, "peak_resident_kib": 20400, "written_bytes": 138657792, "cpu_us_per_transaction": 203.1, "peak_resident_mib": 19.9, "written_bytes_per_transaction": 29583.5, "device_bytes_per_transaction": 22672.6, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 16, "transactions_per_second": 520, "batches": 1169, "batched": 14436, "new_orders_per_minute": 13929, "undone_new_orders": 63, "new_order": {"done": 7067, "failed": 0, "p50_us": 8704, "p99_us": 442368}, "payment": {"done": 6720, "failed": 0, "p50_us": 8192, "p99_us": 393216}, "order_status": {"done": 626, "failed": 0, "p50_us": 136, "p99_us": 960}, "delivery": {"done": 649, "failed": 0, "p50_us": 8192, "p99_us": 409600}, "stock_level": {"done": 634, "failed": 0, "p50_us": 704, "p99_us": 1728}, "cpu_seconds": 2.299, "peak_resident_kib": 46496, "written_bytes": 177504256, "cpu_us_per_transaction": 146.5, "peak_resident_mib": 45.4, "written_bytes_per_transaction": 11308.9, "device_bytes_per_transaction": 10871.0, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 64, "transactions_per_second": 578, "batches": 319, "batched": 16048, "new_orders_per_minute": 15356, "undone_new_orders": 67, "new_order": {"done": 7821, "failed": 0, "p50_us": 19456, "p99_us": 2097152}, "payment": {"done": 7505, "failed": 0, "p50_us": 19456, "p99_us": 2097152}, "order_status": {"done": 715, "failed": 0, "p50_us": 232, "p99_us": 2304}, "delivery": {"done": 722, "failed": 0, "p50_us": 20480, "p99_us": 2097152}, "stock_level": {"done": 743, "failed": 0, "p50_us": 1024, "p99_us": 4864}, "cpu_seconds": 2.521, "peak_resident_kib": 90144, "written_bytes": 138952704, "cpu_us_per_transaction": 144.0, "peak_resident_mib": 88.0, "written_bytes_per_transaction": 7937.4, "device_bytes_per_transaction": 7961.8, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 150.1, "pure_state_mib": 72.8, "pure_store_mib": 69.9, "sqlite_files_mib": 15.1, "grouped_sqlite_files_mib": 19.3, "pure_counts": {"bursts": 6998, "burst_events": 192336, "checkpoints": 8}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-sd-w4-1-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-sd-w4-1-linux-aarch64.jsonl
new file mode 100644
index 0000000..33f39fd
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-sd-w4-1-linux-aarch64.jsonl
@@ -0,0 +1,8 @@
+{"step": "load", "directory": "/home/eunhhu/tpcc-sd", "warehouses": 4, "rows": 1975536, "generate_s": 2.0, "pure_load_s": 12.83, "sqlite_load_s": 6.72, "sqlite_page_size": 1024, "pure_resident_mib": 104.1, "sqlite_file_mib": 52.9}
+{"step": "run", "system": "pure", "warehouses": 4, "terminals": 16, "transactions_per_second": 2247, "new_orders_per_minute": 60581, "undone_new_orders": 298, "errors": 0, "new_order": {"done": 30592, "failed": 0, "p50_us": 5120, "p99_us": 59392}, "payment": {"done": 28635, "failed": 0, "p50_us": 4864, "p99_us": 59392}, "order_status": {"done": 2715, "failed": 0, "p50_us": 112, "p99_us": 336}, "delivery": {"done": 2757, "failed": 0, "p50_us": 5120, "p99_us": 61440}, "stock_level": {"done": 2733, "failed": 0, "p50_us": 168, "p99_us": 400}, "server_threads": "3", "cpu_us_per_transaction": 60.4, "core_shares": {"pure-owner": 0.08}, "resident_mib": 139.9, "written_bytes_per_transaction": 1212.9, "device_bytes_per_transaction": 1225.6, "consistency_failures": []}
+{"step": "run", "system": "pure", "warehouses": 4, "terminals": 64, "transactions_per_second": 4590, "new_orders_per_minute": 123340, "undone_new_orders": 583, "errors": 0, "new_order": {"done": 62254, "failed": 0, "p50_us": 8192, "p99_us": 94208}, "payment": {"done": 59057, "failed": 0, "p50_us": 8192, "p99_us": 94208}, "order_status": {"done": 5455, "failed": 0, "p50_us": 336, "p99_us": 896}, "delivery": {"done": 5543, "failed": 0, "p50_us": 8192, "p99_us": 98304}, "stock_level": {"done": 5397, "failed": 0, "p50_us": 400, "p99_us": 1024}, "server_threads": "3", "cpu_us_per_transaction": 57.3, "core_shares": {"pure-owner": 0.15, "pure-checkpoint": 0.0}, "resident_mib": 217.0, "written_bytes_per_transaction": 649.5, "device_bytes_per_transaction": 680.7, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 4, "terminals": 1, "transactions_per_second": 80, "batches": 0, "batched": 0, "new_orders_per_minute": 2113, "undone_new_orders": 9, "new_order": {"done": 1066, "failed": 0, "p50_us": 6912, "p99_us": 131072}, "payment": {"done": 1031, "failed": 0, "p50_us": 5120, "p99_us": 86016}, "order_status": {"done": 97, "failed": 0, "p50_us": 38, "p99_us": 76}, "delivery": {"done": 105, "failed": 0, "p50_us": 4608, "p99_us": 86016}, "stock_level": {"done": 100, "failed": 0, "p50_us": 464, "p99_us": 704}, "cpu_seconds": 0.547, "peak_resident_kib": 23424, "written_bytes": 63537152, "cpu_us_per_transaction": 228.0, "peak_resident_mib": 22.9, "written_bytes_per_transaction": 26484.8, "device_bytes_per_transaction": 44584.8, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 4, "terminals": 4, "transactions_per_second": 159, "batches": 0, "batched": 0, "new_orders_per_minute": 4274, "undone_new_orders": 22, "new_order": {"done": 2165, "failed": 0, "p50_us": 2048, "p99_us": 90112}, "payment": {"done": 2081, "failed": 0, "p50_us": 1536, "p99_us": 81920}, "order_status": {"done": 190, "failed": 0, "p50_us": 34, "p99_us": 112}, "delivery": {"done": 171, "failed": 0, "p50_us": 1664, "p99_us": 110592}, "stock_level": {"done": 177, "failed": 0, "p50_us": 496, "p99_us": 1344}, "cpu_seconds": 1.003, "peak_resident_kib": 29456, "written_bytes": 146243584, "cpu_us_per_transaction": 209.7, "peak_resident_mib": 28.8, "written_bytes_per_transaction": 30569.3, "device_bytes_per_transaction": 26358.6, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 4, "terminals": 16, "transactions_per_second": 333, "batches": 757, "batched": 9142, "new_orders_per_minute": 9067, "undone_new_orders": 54, "new_order": {"done": 4590, "failed": 0, "p50_us": 10240, "p99_us": 589824}, "payment": {"done": 4167, "failed": 0, "p50_us": 9728, "p99_us": 524288}, "order_status": {"done": 407, "failed": 0, "p50_us": 144, "p99_us": 992}, "delivery": {"done": 385, "failed": 0, "p50_us": 9728, "p99_us": 524288}, "stock_level": {"done": 443, "failed": 0, "p50_us": 768, "p99_us": 1920}, "cpu_seconds": 1.743, "peak_resident_kib": 74848, "written_bytes": 162906112, "cpu_us_per_transaction": 174.4, "peak_resident_mib": 73.1, "written_bytes_per_transaction": 16303.7, "device_bytes_per_transaction": 15001.3, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 4, "terminals": 64, "transactions_per_second": 612, "batches": 355, "batched": 18113, "new_orders_per_minute": 16469, "undone_new_orders": 76, "new_order": {"done": 8872, "failed": 0, "p50_us": 24576, "p99_us": 1769472}, "payment": {"done": 8434, "failed": 0, "p50_us": 23552, "p99_us": 1769472}, "order_status": {"done": 734, "failed": 0, "p50_us": 232, "p99_us": 2176}, "delivery": {"done": 807, "failed": 0, "p50_us": 23552, "p99_us": 1769472}, "stock_level": {"done": 762, "failed": 0, "p50_us": 1088, "p99_us": 5120}, "cpu_seconds": 3.196, "peak_resident_kib": 141968, "written_bytes": 251035648, "cpu_us_per_transaction": 163.0, "peak_resident_mib": 138.6, "written_bytes_per_transaction": 12802.1, "device_bytes_per_transaction": 11785.6, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 217.0, "pure_state_mib": 134.4, "pure_store_mib": 112.4, "sqlite_files_mib": 54.1, "grouped_sqlite_files_mib": 58.1, "pure_counts": {"bursts": 6213, "burst_events": 188103, "checkpoints": 4}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-sd-w4-2-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-sd-w4-2-linux-aarch64.jsonl
new file mode 100644
index 0000000..4a33fd4
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-sd-w4-2-linux-aarch64.jsonl
@@ -0,0 +1,8 @@
+{"step": "load", "directory": "/home/eunhhu/tpcc-sd", "warehouses": 4, "rows": 1975536, "generate_s": 2.01, "pure_load_s": 7.85, "sqlite_load_s": 6.48, "sqlite_page_size": 1024, "pure_resident_mib": 104.1, "sqlite_file_mib": 52.9}
+{"step": "run", "system": "pure", "warehouses": 4, "terminals": 16, "transactions_per_second": 1893, "new_orders_per_minute": 51120, "undone_new_orders": 244, "errors": 0, "new_order": {"done": 25817, "failed": 0, "p50_us": 5376, "p99_us": 59392}, "payment": {"done": 24091, "failed": 0, "p50_us": 5120, "p99_us": 57344}, "order_status": {"done": 2252, "failed": 0, "p50_us": 112, "p99_us": 352}, "delivery": {"done": 2327, "failed": 0, "p50_us": 5120, "p99_us": 49152}, "stock_level": {"done": 2322, "failed": 0, "p50_us": 184, "p99_us": 416}, "server_threads": "3", "cpu_us_per_transaction": 64.4, "core_shares": {"pure-owner": 0.07}, "resident_mib": 134.2, "written_bytes_per_transaction": 1216.5, "device_bytes_per_transaction": 1245.1, "consistency_failures": []}
+{"step": "run", "system": "pure", "warehouses": 4, "terminals": 64, "transactions_per_second": 4324, "new_orders_per_minute": 116334, "undone_new_orders": 544, "errors": 0, "new_order": {"done": 58715, "failed": 0, "p50_us": 8704, "p99_us": 102400}, "payment": {"done": 55623, "failed": 0, "p50_us": 8704, "p99_us": 94208}, "order_status": {"done": 5123, "failed": 0, "p50_us": 352, "p99_us": 896}, "delivery": {"done": 5225, "failed": 0, "p50_us": 8704, "p99_us": 94208}, "stock_level": {"done": 5053, "failed": 0, "p50_us": 416, "p99_us": 992}, "server_threads": "3", "cpu_us_per_transaction": 58.6, "core_shares": {"pure-owner": 0.14, "pure-checkpoint": 0.0}, "resident_mib": 209.4, "written_bytes_per_transaction": 661.7, "device_bytes_per_transaction": 681.8, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 4, "terminals": 1, "transactions_per_second": 89, "batches": 0, "batched": 0, "new_orders_per_minute": 2337, "undone_new_orders": 10, "new_order": {"done": 1179, "failed": 0, "p50_us": 6912, "p99_us": 114688}, "payment": {"done": 1153, "failed": 0, "p50_us": 5888, "p99_us": 81920}, "order_status": {"done": 110, "failed": 0, "p50_us": 36, "p99_us": 68}, "delivery": {"done": 114, "failed": 0, "p50_us": 6144, "p99_us": 36864}, "stock_level": {"done": 113, "failed": 0, "p50_us": 448, "p99_us": 864}, "cpu_seconds": 0.601, "peak_resident_kib": 24448, "written_bytes": 70483968, "cpu_us_per_transaction": 225.2, "peak_resident_mib": 23.9, "written_bytes_per_transaction": 26408.4, "device_bytes_per_transaction": 40111.3, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 4, "terminals": 4, "transactions_per_second": 222, "batches": 0, "batched": 0, "new_orders_per_minute": 5896, "undone_new_orders": 25, "new_order": {"done": 2982, "failed": 0, "p50_us": 1920, "p99_us": 81920}, "payment": {"done": 2929, "failed": 0, "p50_us": 1344, "p99_us": 57344}, "order_status": {"done": 266, "failed": 0, "p50_us": 34, "p99_us": 80}, "delivery": {"done": 265, "failed": 0, "p50_us": 1600, "p99_us": 53248}, "stock_level": {"done": 245, "failed": 0, "p50_us": 496, "p99_us": 960}, "cpu_seconds": 1.292, "peak_resident_kib": 28336, "written_bytes": 211664896, "cpu_us_per_transaction": 193.2, "peak_resident_mib": 27.7, "written_bytes_per_transaction": 31653.2, "device_bytes_per_transaction": 22032.2, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 4, "terminals": 16, "transactions_per_second": 546, "batches": 1313, "batched": 15759, "new_orders_per_minute": 14787, "undone_new_orders": 84, "new_order": {"done": 7823, "failed": 0, "p50_us": 9728, "p99_us": 507904}, "payment": {"done": 7233, "failed": 0, "p50_us": 9216, "p99_us": 442368}, "order_status": {"done": 672, "failed": 0, "p50_us": 144, "p99_us": 1472}, "delivery": {"done": 703, "failed": 0, "p50_us": 9216, "p99_us": 393216}, "stock_level": {"done": 725, "failed": 0, "p50_us": 832, "p99_us": 2304}, "cpu_seconds": 3.1, "peak_resident_kib": 78592, "written_bytes": 262307840, "cpu_us_per_transaction": 180.7, "peak_resident_mib": 76.8, "written_bytes_per_transaction": 15289.6, "device_bytes_per_transaction": 13845.1, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 4, "terminals": 64, "transactions_per_second": 426, "batches": 234, "batched": 11844, "new_orders_per_minute": 11421, "undone_new_orders": 53, "new_order": {"done": 5775, "failed": 0, "p50_us": 26624, "p99_us": 2097152}, "payment": {"done": 5545, "failed": 0, "p50_us": 26624, "p99_us": 2097152}, "order_status": {"done": 479, "failed": 0, "p50_us": 256, "p99_us": 2048}, "delivery": {"done": 524, "failed": 0, "p50_us": 26624, "p99_us": 2097152}, "stock_level": {"done": 469, "failed": 0, "p50_us": 1088, "p99_us": 3840}, "cpu_seconds": 2.071, "peak_resident_kib": 139152, "written_bytes": 170655744, "cpu_us_per_transaction": 161.9, "peak_resident_mib": 135.9, "written_bytes_per_transaction": 13340.8, "device_bytes_per_transaction": 12500.6, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 209.4, "pure_state_mib": 129.9, "pure_store_mib": 104.4, "sqlite_files_mib": 54.6, "grouped_sqlite_files_mib": 58.2, "pure_counts": {"bursts": 5513, "burst_events": 171157, "checkpoints": 3}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-sd-w4-3-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-sd-w4-3-linux-aarch64.jsonl
new file mode 100644
index 0000000..e8d328e
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-sd-w4-3-linux-aarch64.jsonl
@@ -0,0 +1,8 @@
+{"step": "load", "directory": "/home/eunhhu/tpcc-sd", "warehouses": 4, "rows": 1975536, "generate_s": 2.4, "pure_load_s": 5.14, "sqlite_load_s": 6.63, "sqlite_page_size": 1024, "pure_resident_mib": 104.1, "sqlite_file_mib": 52.9}
+{"step": "run", "system": "pure", "warehouses": 4, "terminals": 16, "transactions_per_second": 2314, "new_orders_per_minute": 62410, "undone_new_orders": 305, "errors": 0, "new_order": {"done": 31519, "failed": 0, "p50_us": 5376, "p99_us": 59392}, "payment": {"done": 29491, "failed": 0, "p50_us": 5120, "p99_us": 59392}, "order_status": {"done": 2792, "failed": 0, "p50_us": 120, "p99_us": 544}, "delivery": {"done": 2832, "failed": 0, "p50_us": 5120, "p99_us": 55296}, "stock_level": {"done": 2806, "failed": 0, "p50_us": 184, "p99_us": 704}, "server_threads": "3", "cpu_us_per_transaction": 63.8, "core_shares": {"pure-owner": 0.09}, "resident_mib": 140.9, "written_bytes_per_transaction": 1261.6, "device_bytes_per_transaction": 1248.0, "consistency_failures": []}
+{"step": "run", "system": "pure", "warehouses": 4, "terminals": 64, "transactions_per_second": 5540, "new_orders_per_minute": 148812, "undone_new_orders": 721, "errors": 0, "new_order": {"done": 75134, "failed": 0, "p50_us": 8192, "p99_us": 73728}, "payment": {"done": 71335, "failed": 0, "p50_us": 8192, "p99_us": 73728}, "order_status": {"done": 6544, "failed": 0, "p50_us": 320, "p99_us": 992}, "delivery": {"done": 6679, "failed": 0, "p50_us": 8192, "p99_us": 77824}, "stock_level": {"done": 6514, "failed": 0, "p50_us": 400, "p99_us": 1024}, "server_threads": "3", "cpu_us_per_transaction": 56.6, "core_shares": {"pure-owner": 0.17, "pure-checkpoint": 0.0}, "resident_mib": 238.7, "written_bytes_per_transaction": 684.9, "device_bytes_per_transaction": 720.6, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 4, "terminals": 1, "transactions_per_second": 84, "batches": 0, "batched": 0, "new_orders_per_minute": 2209, "undone_new_orders": 10, "new_order": {"done": 1117, "failed": 0, "p50_us": 6656, "p99_us": 94208}, "payment": {"done": 1091, "failed": 0, "p50_us": 4864, "p99_us": 69632}, "order_status": {"done": 104, "failed": 0, "p50_us": 40, "p99_us": 88}, "delivery": {"done": 108, "failed": 0, "p50_us": 5888, "p99_us": 94208}, "stock_level": {"done": 106, "failed": 0, "p50_us": 512, "p99_us": 1664}, "cpu_seconds": 0.634, "peak_resident_kib": 23296, "written_bytes": 66748416, "cpu_us_per_transaction": 251.0, "peak_resident_mib": 22.8, "written_bytes_per_transaction": 26424.6, "device_bytes_per_transaction": 39508.7, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 4, "terminals": 4, "transactions_per_second": 161, "batches": 0, "batched": 0, "new_orders_per_minute": 4287, "undone_new_orders": 20, "new_order": {"done": 2185, "failed": 0, "p50_us": 2304, "p99_us": 102400}, "payment": {"done": 2143, "failed": 0, "p50_us": 1600, "p99_us": 61440}, "order_status": {"done": 195, "failed": 0, "p50_us": 34, "p99_us": 120}, "delivery": {"done": 182, "failed": 0, "p50_us": 1856, "p99_us": 90112}, "stock_level": {"done": 181, "failed": 0, "p50_us": 480, "p99_us": 1344}, "cpu_seconds": 1.013, "peak_resident_kib": 29456, "written_bytes": 163610624, "cpu_us_per_transaction": 207.3, "peak_resident_mib": 28.8, "written_bytes_per_transaction": 33485.6, "device_bytes_per_transaction": 25886.3, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 4, "terminals": 16, "transactions_per_second": 335, "batches": 758, "batched": 9214, "new_orders_per_minute": 9108, "undone_new_orders": 55, "new_order": {"done": 4617, "failed": 0, "p50_us": 11776, "p99_us": 655360}, "payment": {"done": 4206, "failed": 0, "p50_us": 10752, "p99_us": 589824}, "order_status": {"done": 408, "failed": 0, "p50_us": 152, "p99_us": 1216}, "delivery": {"done": 391, "failed": 0, "p50_us": 11264, "p99_us": 589824}, "stock_level": {"done": 445, "failed": 0, "p50_us": 832, "p99_us": 1984}, "cpu_seconds": 1.869, "peak_resident_kib": 74848, "written_bytes": 163545088, "cpu_us_per_transaction": 185.7, "peak_resident_mib": 73.1, "written_bytes_per_transaction": 16245.7, "device_bytes_per_transaction": 15129.6, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 4, "terminals": 64, "transactions_per_second": 302, "batches": 173, "batched": 8704, "new_orders_per_minute": 8096, "undone_new_orders": 44, "new_order": {"done": 4232, "failed": 0, "p50_us": 30720, "p99_us": 1769472}, "payment": {"done": 4086, "failed": 0, "p50_us": 28672, "p99_us": 1769472}, "order_status": {"done": 342, "failed": 0, "p50_us": 232, "p99_us": 2432}, "delivery": {"done": 386, "failed": 0, "p50_us": 27648, "p99_us": 1769472}, "stock_level": {"done": 341, "failed": 0, "p50_us": 1088, "p99_us": 3712}, "cpu_seconds": 1.583, "peak_resident_kib": 137888, "written_bytes": 120307712, "cpu_us_per_transaction": 168.6, "peak_resident_mib": 134.7, "written_bytes_per_transaction": 12816.4, "device_bytes_per_transaction": 12067.2, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 238.7, "pure_state_mib": 141.7, "pure_store_mib": 127.7, "sqlite_files_mib": 54.2, "grouped_sqlite_files_mib": 56.3, "pure_counts": {"bursts": 7069, "burst_events": 216109, "checkpoints": 5}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-tune-ram-checkpoint10000-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-tune-ram-checkpoint10000-linux-aarch64.jsonl
new file mode 100644
index 0000000..0ef2e93
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-tune-ram-checkpoint10000-linux-aarch64.jsonl
@@ -0,0 +1,6 @@
+{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.55, "pure_load_s": 0.72, "sqlite_load_s": 1.59, "sqlite_page_size": 4096, "pure_resident_mib": 38.1, "sqlite_file_mib": 13.8}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=10000;", "warehouses": 1, "terminals": 1, "transactions_per_second": 10361, "batches": 0, "batched": 0, "new_orders_per_minute": 277720, "undone_new_orders": 985, "new_order": {"done": 93601, "failed": 0, "p50_us": 144, "p99_us": 240}, "payment": {"done": 88864, "failed": 0, "p50_us": 24, "p99_us": 42}, "order_status": {"done": 8232, "failed": 0, "p50_us": 16, "p99_us": 29}, "delivery": {"done": 8375, "failed": 0, "p50_us": 54, "p99_us": 352}, "stock_level": {"done": 8238, "failed": 0, "p50_us": 256, "p99_us": 384}, "cpu_seconds": 19.969, "peak_resident_kib": 99536, "written_bytes": 0, "cpu_us_per_transaction": 96.3, "peak_resident_mib": 97.2, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=10000;", "warehouses": 1, "terminals": 4, "transactions_per_second": 10272, "batches": 0, "batched": 0, "new_orders_per_minute": 274956, "undone_new_orders": 956, "new_order": {"done": 92992, "failed": 0, "p50_us": 152, "p99_us": 256}, "payment": {"done": 88632, "failed": 0, "p50_us": 24, "p99_us": 46}, "order_status": {"done": 8258, "failed": 0, "p50_us": 19, "p99_us": 36}, "delivery": {"done": 8312, "failed": 0, "p50_us": 58, "p99_us": 120}, "stock_level": {"done": 8101, "failed": 0, "p50_us": 256, "p99_us": 512}, "cpu_seconds": 20.252, "peak_resident_kib": 47584, "written_bytes": 0, "cpu_us_per_transaction": 98.2, "peak_resident_mib": 46.5, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=10000;", "warehouses": 1, "terminals": 16, "transactions_per_second": 9890, "batches": 15719, "batched": 182112, "new_orders_per_minute": 264838, "undone_new_orders": 892, "new_order": {"done": 89225, "failed": 0, "p50_us": 1600, "p99_us": 4096}, "payment": {"done": 84912, "failed": 0, "p50_us": 1472, "p99_us": 4096}, "order_status": {"done": 7985, "failed": 0, "p50_us": 128, "p99_us": 832}, "delivery": {"done": 7975, "failed": 0, "p50_us": 1536, "p99_us": 4096}, "stock_level": {"done": 7814, "failed": 0, "p50_us": 736, "p99_us": 1856}, "cpu_seconds": 26.449, "peak_resident_kib": 78160, "written_bytes": 0, "cpu_us_per_transaction": 133.6, "peak_resident_mib": 76.3, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=10000;", "warehouses": 1, "terminals": 64, "transactions_per_second": 10211, "batches": 3729, "batched": 188334, "new_orders_per_minute": 272489, "undone_new_orders": 882, "new_order": {"done": 91962, "failed": 0, "p50_us": 5888, "p99_us": 12800}, "payment": {"done": 88143, "failed": 0, "p50_us": 5632, "p99_us": 12800}, "order_status": {"done": 8302, "failed": 0, "p50_us": 232, "p99_us": 1600}, "delivery": {"done": 8229, "failed": 0, "p50_us": 5888, "p99_us": 12800}, "stock_level": {"done": 8140, "failed": 0, "p50_us": 1152, "p99_us": 3840}, "cpu_seconds": 27.095, "peak_resident_kib": 132976, "written_bytes": 0, "cpu_us_per_transaction": 132.3, "peak_resident_mib": 129.9, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 38.1, "pure_state_mib": 22.3, "pure_store_mib": 16.3, "sqlite_files_mib": 81.6, "grouped_sqlite_files_mib": 79.6, "pure_counts": {"bursts": 23, "burst_events": 23, "checkpoints": 0}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-tune-ram-defaults-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-tune-ram-defaults-linux-aarch64.jsonl
new file mode 100644
index 0000000..a6b3dce
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-tune-ram-defaults-linux-aarch64.jsonl
@@ -0,0 +1,6 @@
+{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 0.71, "sqlite_load_s": 1.57, "sqlite_page_size": 4096, "pure_resident_mib": 38.1, "sqlite_file_mib": 13.8}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "", "warehouses": 1, "terminals": 1, "transactions_per_second": 9390, "batches": 0, "batched": 0, "new_orders_per_minute": 251592, "undone_new_orders": 884, "new_order": {"done": 84757, "failed": 0, "p50_us": 152, "p99_us": 1152}, "payment": {"done": 80506, "failed": 0, "p50_us": 25, "p99_us": 56}, "order_status": {"done": 7493, "failed": 0, "p50_us": 18, "p99_us": 34}, "delivery": {"done": 7579, "failed": 0, "p50_us": 60, "p99_us": 124}, "stock_level": {"done": 7495, "failed": 0, "p50_us": 288, "p99_us": 432}, "cpu_seconds": 19.974, "peak_resident_kib": 4192, "written_bytes": 0, "cpu_us_per_transaction": 106.3, "peak_resident_mib": 4.1, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "", "warehouses": 1, "terminals": 4, "transactions_per_second": 9083, "batches": 0, "batched": 0, "new_orders_per_minute": 243389, "undone_new_orders": 867, "new_order": {"done": 82061, "failed": 0, "p50_us": 160, "p99_us": 1216}, "payment": {"done": 78018, "failed": 0, "p50_us": 25, "p99_us": 136}, "order_status": {"done": 7272, "failed": 0, "p50_us": 19, "p99_us": 42}, "delivery": {"done": 7330, "failed": 0, "p50_us": 62, "p99_us": 400}, "stock_level": {"done": 7126, "failed": 0, "p50_us": 288, "p99_us": 640}, "cpu_seconds": 20.467, "peak_resident_kib": 7328, "written_bytes": 0, "cpu_us_per_transaction": 112.6, "peak_resident_mib": 7.2, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "", "warehouses": 1, "terminals": 16, "transactions_per_second": 7872, "batches": 12440, "batched": 145000, "new_orders_per_minute": 210743, "undone_new_orders": 713, "new_order": {"done": 71012, "failed": 0, "p50_us": 1984, "p99_us": 4608}, "payment": {"done": 67658, "failed": 0, "p50_us": 1792, "p99_us": 4608}, "order_status": {"done": 6359, "failed": 0, "p50_us": 92, "p99_us": 832}, "delivery": {"done": 6330, "failed": 0, "p50_us": 1856, "p99_us": 4608}, "stock_level": {"done": 6204, "failed": 0, "p50_us": 672, "p99_us": 1728}, "cpu_seconds": 24.599, "peak_resident_kib": 17056, "written_bytes": 1193492480, "cpu_us_per_transaction": 156.1, "peak_resident_mib": 16.7, "written_bytes_per_transaction": 7574.7, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "", "warehouses": 1, "terminals": 64, "transactions_per_second": 8555, "batches": 3087, "batched": 157781, "new_orders_per_minute": 228539, "undone_new_orders": 757, "new_order": {"done": 77144, "failed": 0, "p50_us": 6912, "p99_us": 14848}, "payment": {"done": 73743, "failed": 0, "p50_us": 6912, "p99_us": 14848}, "order_status": {"done": 6967, "failed": 0, "p50_us": 144, "p99_us": 1728}, "delivery": {"done": 6894, "failed": 0, "p50_us": 6912, "p99_us": 14848}, "stock_level": {"done": 6816, "failed": 0, "p50_us": 1088, "p99_us": 3840}, "cpu_seconds": 25.452, "peak_resident_kib": 49632, "written_bytes": 332038144, "cpu_us_per_transaction": 148.4, "peak_resident_mib": 48.5, "written_bytes_per_transaction": 1935.4, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 38.1, "pure_state_mib": 22.3, "pure_store_mib": 16.3, "sqlite_files_mib": 74.3, "grouped_sqlite_files_mib": 66.9, "pure_counts": {"bursts": 23, "burst_events": 23, "checkpoints": 0}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-tune-ram-tuned-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-tune-ram-tuned-linux-aarch64.jsonl
new file mode 100644
index 0000000..8ab04e7
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-tune-ram-tuned-linux-aarch64.jsonl
@@ -0,0 +1,6 @@
+{"step": "load", "directory": "/dev/shm", "warehouses": 1, "rows": 568758, "generate_s": 0.57, "pure_load_s": 0.72, "sqlite_load_s": 1.58, "sqlite_page_size": 4096, "pure_resident_mib": 38.1, "sqlite_file_mib": 13.8}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY;", "warehouses": 1, "terminals": 1, "transactions_per_second": 9886, "batches": 0, "batched": 0, "new_orders_per_minute": 264943, "undone_new_orders": 929, "new_order": {"done": 89271, "failed": 0, "p50_us": 144, "p99_us": 1152}, "payment": {"done": 84801, "failed": 0, "p50_us": 23, "p99_us": 44}, "order_status": {"done": 7865, "failed": 0, "p50_us": 16, "p99_us": 26}, "delivery": {"done": 7986, "failed": 0, "p50_us": 54, "p99_us": 368}, "stock_level": {"done": 7864, "failed": 0, "p50_us": 272, "p99_us": 368}, "cpu_seconds": 19.988, "peak_resident_kib": 96208, "written_bytes": 0, "cpu_us_per_transaction": 101.1, "peak_resident_mib": 94.0, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY;", "warehouses": 1, "terminals": 4, "transactions_per_second": 9470, "batches": 0, "batched": 0, "new_orders_per_minute": 253726, "undone_new_orders": 903, "new_order": {"done": 85757, "failed": 0, "p50_us": 152, "p99_us": 1216}, "payment": {"done": 81562, "failed": 0, "p50_us": 24, "p99_us": 72}, "order_status": {"done": 7574, "failed": 0, "p50_us": 19, "p99_us": 40}, "delivery": {"done": 7606, "failed": 0, "p50_us": 60, "p99_us": 208}, "stock_level": {"done": 7530, "failed": 0, "p50_us": 272, "p99_us": 480}, "cpu_seconds": 20.462, "peak_resident_kib": 44912, "written_bytes": 0, "cpu_us_per_transaction": 107.7, "peak_resident_mib": 43.9, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY;", "warehouses": 1, "terminals": 16, "transactions_per_second": 9680, "batches": 15653, "batched": 178250, "new_orders_per_minute": 259351, "undone_new_orders": 879, "new_order": {"done": 87378, "failed": 0, "p50_us": 1600, "p99_us": 4096}, "payment": {"done": 83064, "failed": 0, "p50_us": 1472, "p99_us": 3968}, "order_status": {"done": 7804, "failed": 0, "p50_us": 120, "p99_us": 768}, "delivery": {"done": 7808, "failed": 0, "p50_us": 1536, "p99_us": 3968}, "stock_level": {"done": 7647, "failed": 0, "p50_us": 608, "p99_us": 1792}, "cpu_seconds": 25.602, "peak_resident_kib": 83616, "written_bytes": 0, "cpu_us_per_transaction": 132.2, "peak_resident_mib": 81.7, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY;", "warehouses": 1, "terminals": 64, "transactions_per_second": 10230, "batches": 3738, "batched": 188675, "new_orders_per_minute": 273034, "undone_new_orders": 884, "new_order": {"done": 92142, "failed": 0, "p50_us": 5888, "p99_us": 12288}, "payment": {"done": 88293, "failed": 0, "p50_us": 5888, "p99_us": 12288}, "order_status": {"done": 8311, "failed": 0, "p50_us": 224, "p99_us": 1856}, "delivery": {"done": 8240, "failed": 0, "p50_us": 5888, "p99_us": 12288}, "stock_level": {"done": 8160, "failed": 0, "p50_us": 896, "p99_us": 3328}, "cpu_seconds": 26.17, "peak_resident_kib": 161392, "written_bytes": 0, "cpu_us_per_transaction": 127.6, "peak_resident_mib": 157.6, "written_bytes_per_transaction": 0.0, "device_bytes_per_transaction": null, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 38.1, "pure_state_mib": 22.3, "pure_store_mib": 16.3, "sqlite_files_mib": 77.3, "grouped_sqlite_files_mib": 78.1, "pure_counts": {"bursts": 23, "burst_events": 23, "checkpoints": 0}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-tune-sd-page1024-checkpoint40000-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-tune-sd-page1024-checkpoint40000-linux-aarch64.jsonl
new file mode 100644
index 0000000..99b19bf
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-tune-sd-page1024-checkpoint40000-linux-aarch64.jsonl
@@ -0,0 +1,5 @@
+{"step": "load", "directory": "/home/eunhhu/tpcc-sd", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 2.1, "sqlite_load_s": 1.75, "sqlite_page_size": 1024, "pure_resident_mib": 38.1, "sqlite_file_mib": 13.8}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 1, "transactions_per_second": 87, "batches": 0, "batched": 0, "new_orders_per_minute": 2378, "undone_new_orders": 7, "new_order": {"done": 1284, "failed": 0, "p50_us": 6400, "p99_us": 98304}, "payment": {"done": 1164, "failed": 0, "p50_us": 4352, "p99_us": 65536}, "order_status": {"done": 101, "failed": 0, "p50_us": 38, "p99_us": 80}, "delivery": {"done": 126, "failed": 0, "p50_us": 4608, "p99_us": 59392}, "stock_level": {"done": 113, "failed": 0, "p50_us": 448, "p99_us": 640}, "cpu_seconds": 0.599, "peak_resident_kib": 17200, "written_bytes": 79314944, "cpu_us_per_transaction": 214.8, "peak_resident_mib": 16.8, "written_bytes_per_transaction": 28448.7, "device_bytes_per_transaction": 40851.3, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 16, "transactions_per_second": 694, "batches": 1592, "batched": 19413, "new_orders_per_minute": 18673, "undone_new_orders": 77, "new_order": {"done": 9553, "failed": 0, "p50_us": 8192, "p99_us": 458752}, "payment": {"done": 8996, "failed": 0, "p50_us": 7936, "p99_us": 393216}, "order_status": {"done": 845, "failed": 0, "p50_us": 136, "p99_us": 992}, "delivery": {"done": 864, "failed": 0, "p50_us": 8192, "p99_us": 360448}, "stock_level": {"done": 861, "failed": 0, "p50_us": 736, "p99_us": 1856}, "cpu_seconds": 3.216, "peak_resident_kib": 50400, "written_bytes": 239173632, "cpu_us_per_transaction": 152.3, "peak_resident_mib": 49.2, "written_bytes_per_transaction": 11325.0, "device_bytes_per_transaction": 10658.8, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY; PRAGMA wal_autocheckpoint=40000;", "warehouses": 1, "terminals": 64, "transactions_per_second": 594, "batches": 353, "batched": 17943, "new_orders_per_minute": 15776, "undone_new_orders": 75, "new_order": {"done": 8738, "failed": 0, "p50_us": 40960, "p99_us": 1507328}, "payment": {"done": 8403, "failed": 0, "p50_us": 40960, "p99_us": 1507328}, "order_status": {"done": 798, "failed": 0, "p50_us": 232, "p99_us": 2816}, "delivery": {"done": 802, "failed": 0, "p50_us": 43008, "p99_us": 1507328}, "stock_level": {"done": 818, "failed": 0, "p50_us": 1088, "p99_us": 4608}, "cpu_seconds": 3.084, "peak_resident_kib": 90144, "written_bytes": 155779072, "cpu_us_per_transaction": 157.7, "peak_resident_mib": 88.0, "written_bytes_per_transaction": 7964.6, "device_bytes_per_transaction": 7658.8, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 38.1, "pure_state_mib": 22.3, "pure_store_mib": 16.3, "sqlite_files_mib": 14.3, "grouped_sqlite_files_mib": 20.6, "pure_counts": {"bursts": 23, "burst_events": 23, "checkpoints": 0}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-tune-sd-page1024-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-tune-sd-page1024-linux-aarch64.jsonl
new file mode 100644
index 0000000..b333d41
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-tune-sd-page1024-linux-aarch64.jsonl
@@ -0,0 +1,5 @@
+{"step": "load", "directory": "/home/eunhhu/tpcc-sd", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 3.39, "sqlite_load_s": 1.75, "sqlite_page_size": 1024, "pure_resident_mib": 38.1, "sqlite_file_mib": 13.8}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY;", "warehouses": 1, "terminals": 1, "transactions_per_second": 132, "batches": 0, "batched": 0, "new_orders_per_minute": 3581, "undone_new_orders": 13, "new_order": {"done": 1807, "failed": 0, "p50_us": 1856, "p99_us": 344064}, "payment": {"done": 1672, "failed": 0, "p50_us": 1216, "p99_us": 49152}, "order_status": {"done": 146, "failed": 0, "p50_us": 28, "p99_us": 64}, "delivery": {"done": 180, "failed": 0, "p50_us": 1280, "p99_us": 32768}, "stock_level": {"done": 161, "failed": 0, "p50_us": 320, "p99_us": 512}, "cpu_seconds": 0.72, "peak_resident_kib": 18320, "written_bytes": 238108672, "cpu_us_per_transaction": 181.5, "peak_resident_mib": 17.9, "written_bytes_per_transaction": 60037.5, "device_bytes_per_transaction": 31910.8, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY;", "warehouses": 1, "terminals": 16, "transactions_per_second": 203, "batches": 460, "batched": 5615, "new_orders_per_minute": 5475, "undone_new_orders": 17, "new_order": {"done": 2761, "failed": 0, "p50_us": 10240, "p99_us": 557056}, "payment": {"done": 2623, "failed": 0, "p50_us": 8704, "p99_us": 557056}, "order_status": {"done": 251, "failed": 0, "p50_us": 128, "p99_us": 1088}, "delivery": {"done": 231, "failed": 0, "p50_us": 10240, "p99_us": 753664}, "stock_level": {"done": 248, "failed": 0, "p50_us": 608, "p99_us": 1792}, "cpu_seconds": 1.068, "peak_resident_kib": 46336, "written_bytes": 221954048, "cpu_us_per_transaction": 174.7, "peak_resident_mib": 45.2, "written_bytes_per_transaction": 36302.6, "device_bytes_per_transaction": 22472.4, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY;", "warehouses": 1, "terminals": 64, "transactions_per_second": 263, "batches": 146, "batched": 7401, "new_orders_per_minute": 7054, "undone_new_orders": 32, "new_order": {"done": 3630, "failed": 0, "p50_us": 69632, "p99_us": 1703936}, "payment": {"done": 3457, "failed": 0, "p50_us": 69632, "p99_us": 1703936}, "order_status": {"done": 294, "failed": 0, "p50_us": 216, "p99_us": 3712}, "delivery": {"done": 314, "failed": 0, "p50_us": 73728, "p99_us": 1703936}, "stock_level": {"done": 343, "failed": 0, "p50_us": 800, "p99_us": 2688}, "cpu_seconds": 1.475, "peak_resident_kib": 117360, "written_bytes": 219840512, "cpu_us_per_transaction": 183.5, "peak_resident_mib": 114.6, "written_bytes_per_transaction": 27350.2, "device_bytes_per_transaction": 17944.8, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 38.1, "pure_state_mib": 22.3, "pure_store_mib": 16.3, "sqlite_files_mib": 14.5, "grouped_sqlite_files_mib": 16.2, "pure_counts": {"bursts": 23, "burst_events": 23, "checkpoints": 0}}
diff --git a/research/experiments/022-tpcc-grouped/2026-09-30-tune-sd-page4096-linux-aarch64.jsonl b/research/experiments/022-tpcc-grouped/2026-09-30-tune-sd-page4096-linux-aarch64.jsonl
new file mode 100644
index 0000000..84de24f
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/2026-09-30-tune-sd-page4096-linux-aarch64.jsonl
@@ -0,0 +1,5 @@
+{"step": "load", "directory": "/home/eunhhu/tpcc-sd", "warehouses": 1, "rows": 568758, "generate_s": 0.56, "pure_load_s": 3.36, "sqlite_load_s": 1.6, "sqlite_page_size": 4096, "pure_resident_mib": 38.1, "sqlite_file_mib": 13.8}
+{"step": "run", "system": "sqlite 3.46.1", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY;", "warehouses": 1, "terminals": 1, "transactions_per_second": 72, "batches": 0, "batched": 0, "new_orders_per_minute": 1986, "undone_new_orders": 7, "new_order": {"done": 1003, "failed": 0, "p50_us": 4608, "p99_us": 344064}, "payment": {"done": 904, "failed": 0, "p50_us": 1600, "p99_us": 110592}, "order_status": {"done": 77, "failed": 0, "p50_us": 31, "p99_us": 56}, "delivery": {"done": 103, "failed": 0, "p50_us": 1792, "p99_us": 65536}, "stock_level": {"done": 93, "failed": 0, "p50_us": 416, "p99_us": 544}, "cpu_seconds": 0.478, "peak_resident_kib": 16160, "written_bytes": 184336384, "cpu_us_per_transaction": 219.3, "peak_resident_mib": 15.8, "written_bytes_per_transaction": 84558.0, "device_bytes_per_transaction": 60696.0, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY;", "warehouses": 1, "terminals": 16, "transactions_per_second": 162, "batches": 369, "batched": 4527, "new_orders_per_minute": 4397, "undone_new_orders": 16, "new_order": {"done": 2244, "failed": 0, "p50_us": 18432, "p99_us": 1572864}, "payment": {"done": 2090, "failed": 0, "p50_us": 16384, "p99_us": 1245184}, "order_status": {"done": 197, "failed": 0, "p50_us": 136, "p99_us": 960}, "delivery": {"done": 193, "failed": 0, "p50_us": 16384, "p99_us": 1179648}, "stock_level": {"done": 194, "failed": 0, "p50_us": 736, "p99_us": 1856}, "cpu_seconds": 0.976, "peak_resident_kib": 40816, "written_bytes": 256081920, "cpu_us_per_transaction": 198.5, "peak_resident_mib": 39.9, "written_bytes_per_transaction": 52070.3, "device_bytes_per_transaction": 41787.9, "consistency_failures": []}
+{"step": "run", "system": "sqlite 3.46.1, grouped", "synchronous": "full", "pragmas": "PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY;", "warehouses": 1, "terminals": 64, "transactions_per_second": 139, "batches": 78, "batched": 3915, "new_orders_per_minute": 3739, "undone_new_orders": 20, "new_order": {"done": 1918, "failed": 0, "p50_us": 86016, "p99_us": 3538944}, "payment": {"done": 1839, "failed": 0, "p50_us": 86016, "p99_us": 3538944}, "order_status": {"done": 143, "failed": 0, "p50_us": 176, "p99_us": 3200}, "delivery": {"done": 158, "failed": 0, "p50_us": 122880, "p99_us": 3538944}, "stock_level": {"done": 182, "failed": 0, "p50_us": 864, "p99_us": 4864}, "cpu_seconds": 0.815, "peak_resident_kib": 99872, "written_bytes": 149323776, "cpu_us_per_transaction": 192.2, "peak_resident_mib": 97.5, "written_bytes_per_transaction": 35217.9, "device_bytes_per_transaction": 29277.7, "consistency_failures": []}
+{"step": "end", "pure_resident_mib": 38.1, "pure_state_mib": 22.3, "pure_store_mib": 16.3, "sqlite_files_mib": 14.2, "grouped_sqlite_files_mib": 15.3, "pure_counts": {"bursts": 23, "burst_events": 23, "checkpoints": 0}}
diff --git a/research/experiments/022-tpcc-grouped/owner-samples.py b/research/experiments/022-tpcc-grouped/owner-samples.py
new file mode 100644
index 0000000..5415cf6
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/owner-samples.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python3
+"""Where pure-serve's owner thread is: its stack sampled with gdb (a poor man's profiler; perf is not on this Pi).
+
+ owner-samples.py SAMPLES OUT.txt
+
+Waits for a pure-serve with a pure-owner thread, then attaches gdb SAMPLES
+times, a little apart, and keeps the owner's stack each time. Prints how
+many samples had each serve.c phase on the stack, and the innermost frames.
+"""
+import collections
+import re
+import subprocess
+import sys
+import time
+from pathlib import Path
+
+samples, out = int(sys.argv[1]), Path(sys.argv[2])
+
+
+def owner():
+ for proc in Path('/proc').iterdir():
+ if not proc.name.isdigit():
+ continue
+ try:
+ if (proc / 'comm').read_text().strip() != 'pure-serve':
+ continue
+ for task in (proc / 'task').iterdir():
+ if (task / 'comm').read_text().strip() == 'pure-owner':
+ return int(proc.name), int(task.name)
+ except OSError:
+ continue
+ return None
+
+
+found = None
+while not found:
+ found = owner()
+ time.sleep(0.2)
+pid, tid = found
+time.sleep(10) # past loading, into the run
+stacks = []
+for _ in range(samples):
+ text = subprocess.run(['gdb', '-batch', '-nx', '-p', str(pid), '-ex', 'set pagination off',
+ '-ex', 'thread apply all bt 40'], capture_output=True, text=True).stdout
+ # The owner's section: from its "Thread ... (LWP tid)" header to the next thread's.
+ match = re.search(rf'Thread [^\n]*\(LWP {tid}\)[^\n]*\n(.*?)(?=\nThread |\Z)', text, re.S)
+ if match:
+ frames = re.findall(r'^#\d+\s+(?:0x[0-9a-f]+ in )?(\S+)', match.group(1), re.M)
+ stacks.append(frames)
+ time.sleep(0.3)
+out.write_text('\n'.join(' < '.join(s) for s in stacks) + '\n')
+phases = collections.Counter()
+inner = collections.Counter()
+for frames in stacks:
+ names = set(frames)
+ phase = ('waiting' if names & {'pthread_cond_wait', 'pthread_cond_timedwait', '__futex_abstimed_wait_common'}
+ and not names & {'execute'} else
+ 'publish' if 'publish' in names else
+ 'checkpoint_round' if 'checkpoint_round' in names else
+ 'feed_outlets' if 'feed_outlets' in names else
+ 'save' if 'save_burst' in names else
+ 'hand_back' if 'hand_back' in names else
+ 'apply' if 'apply_effect' in names else
+ 'other')
+ phases[phase] += 1
+ inner[frames[0] if frames else '?'] += 1
+print(f'{len(stacks)} samples of the owner (pid {pid}, thread {tid})')
+for phase, n in phases.most_common():
+ print(f' {phase:<18} {n:>4} {n / max(len(stacks), 1):.0%}')
+print('innermost frames:')
+for name, n in inner.most_common(15):
+ print(f' {name:<40} {n:>4}')
diff --git a/research/experiments/022-tpcc-grouped/runs.sh b/research/experiments/022-tpcc-grouped/runs.sh
new file mode 100644
index 0000000..c441b36
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/runs.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+# The runs of docs/research/106, as they were made, from the repository's root
+# (the SD card's directory is any on ext4 there). Each result file records
+# SQLite's pragmas and page size in its lines.
+set -e
+out=research/experiments/022-tpcc-grouped
+sd=${SD:-$HOME/tpcc-sd}
+run() {
+ name=$1
+ shift
+ python3 benchmarks/tpcc/run.py "$@" > $out/2026-09-30-$name-linux-aarch64.jsonl
+}
+tuned='PRAGMA mmap_size=1073741824; PRAGMA cache_size=-65536; PRAGMA temp_store=MEMORY;'
+
+# SQLite's settings, W=1, SQLite alone (harness of 3c04860).
+run tune-ram-defaults --warehouses 1 --check 0 --terminals '' --sqlite-threads 1,4 --sqlite-group 16,64 \
+ --seconds 20 --sqlite-pragmas ''
+run tune-ram-tuned --warehouses 1 --check 0 --terminals '' --sqlite-threads 1,4 --sqlite-group 16,64 \
+ --seconds 20 --sqlite-pragmas "$tuned"
+run tune-sd-page4096 --directory $sd --warehouses 1 --check 0 --terminals '' --sqlite-threads 1 --sqlite-group 16,64 \
+ --seconds 30 --sqlite-pragmas "$tuned"
+run tune-sd-page1024 --directory $sd --warehouses 1 --check 0 --terminals '' --sqlite-threads 1 --sqlite-group 16,64 \
+ --seconds 30 --sqlite-page-size 1024 --sqlite-pragmas "$tuned"
+# Beyond the criteria, in SQLite's favour: a checkpoint each 40 MB of WAL.
+run tune-sd-page1024-checkpoint40000 --directory $sd --warehouses 1 --check 0 --terminals '' --sqlite-threads 1 \
+ --sqlite-group 16,64 --seconds 30 --sqlite-page-size 1024 --sqlite-pragmas "$tuned PRAGMA wal_autocheckpoint=40000;"
+run tune-ram-checkpoint10000 --warehouses 1 --check 0 --terminals '' --sqlite-threads 1,4 --sqlite-group 16,64 \
+ --seconds 20 --sqlite-pragmas "$tuned PRAGMA wal_autocheckpoint=10000;"
+
+# The matrix (harness of 20b313c, SQLite as its tuned() makes it): RAM, then
+# the card in three rounds, W=1 and W=4 taking turns.
+both='--terminals 16,64 --sqlite-threads 1,4 --sqlite-group 16,64'
+run ram-w1 --warehouses 1 --check 20000 $both --seconds 20
+run ram-w4 --warehouses 4 --check 20000 $both --seconds 20
+for round in 1 2 3; do
+ for w in 1 4; do
+ run sd-w$w-$round --directory $sd --warehouses $w --check 0 $both --seconds 30 --sqlite-page-size 1024
+ done
+done
+
+# Where the owner thread is (RAM, W=1, 64 terminals): 80 samples of its stack
+# with gdb while Pure alone runs for 90 seconds.
+python3 $out/owner-samples.py 80 $out/2026-09-30-owner-stacks-linux-aarch64.txt &
+run owner-run --warehouses 1 --check 0 --terminals 64 --sqlite-threads '' --sqlite-group '' --seconds 90
+wait
diff --git a/research/experiments/022-tpcc-grouped/tables.py b/research/experiments/022-tpcc-grouped/tables.py
new file mode 100644
index 0000000..2c018b0
--- /dev/null
+++ b/research/experiments/022-tpcc-grouped/tables.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+"""docs/research/106's tables from the result files beside this one (the names given, as globs: ram-w1, sd-w4-*):
+a row a system and terminal count; on the SD card the median of the rounds and their range."""
+import json
+import statistics
+import sys
+from pathlib import Path
+
+OUT = Path(__file__).resolve().parent
+KINDS = ('new_order', 'payment', 'order_status', 'delivery', 'stock_level')
+
+
+def runs(name):
+ rows = {}
+ ends, checks = [], []
+ for path in sorted(OUT.glob(f'2026-09-30-{name}-linux-aarch64.jsonl')):
+ for line in path.read_text().splitlines():
+ r = json.loads(line)
+ if r['step'] == 'run':
+ system = 'Pure' if r['system'] == 'pure' else 'SQLite 묶음' if 'grouped' in r['system'] else 'SQLite'
+ rows.setdefault((system, r['terminals']), []).append(r)
+ elif r['step'] == 'end':
+ ends.append(r)
+ elif r['step'] == 'same transactions':
+ checks.append(r)
+ return rows, ends, checks
+
+
+def middle(values, digits=0, spread=True):
+ values = [v for v in values if v is not None]
+ if not values:
+ return '-'
+ m = statistics.median(values)
+ text = f'{m:,.{digits}f}'
+ if spread and len(values) > 1:
+ text += f' ({min(values):,.{digits}f}–{max(values):,.{digits}f})'
+ return text
+
+
+def table(name, device):
+ rows, ends, checks = runs(name)
+ order = [('Pure', 16), ('Pure', 64), ('SQLite', 1), ('SQLite', 4), ('SQLite 묶음', 16), ('SQLite 묶음', 64)]
+ print(f'### {name}')
+ for c in checks:
+ print(f"check: failed {c['failed']} differing {c['differing']} grouped {c['grouped_sqlite_differing']} "
+ f"consistency {c['consistency_failures']}")
+ print('| | 초당 거래 | New-Order p50 / p99 (ms) | 거래당 CPU (µs) | 소유자의 코어 몫 | 메모리 (MiB) | 거래당 장치 바이트 | 묶음 크기 |')
+ print('|---|---:|---:|---:|---:|---:|---:|---:|')
+ for key in order:
+ rs = rows.get(key, [])
+ if not rs:
+ continue
+ failures = sum(len(r['consistency_failures']) for r in rs) + sum(r[k]['failed'] for r in rs for k in KINDS)
+ tps = middle([r['transactions_per_second'] for r in rs])
+ p50 = middle([r['new_order']['p50_us'] / 1000 for r in rs], 1, False)
+ p99 = middle([r['new_order']['p99_us'] / 1000 for r in rs], 1, False)
+ cpu = middle([r['cpu_us_per_transaction'] for r in rs], 1, False)
+ owner = middle([r.get('core_shares', {}).get('pure-owner') for r in rs], 2, False)
+ memory = middle([r.get('resident_mib', r.get('peak_resident_mib')) for r in rs], 0, False)
+ dev = middle([r['device_bytes_per_transaction'] for r in rs], 0, False) if device else '-'
+ batch = middle([r['batched'] / r['batches'] for r in rs if r.get('batches')], 1, False)
+ flag = '' if not failures else f' **{failures} failures**'
+ print(f'| {key[0]}, {key[1]}{"터미널" if key[0] != "SQLite" else "스레드"} | {tps} | {p50} / {p99} | {cpu} | '
+ f'{owner} | {memory} | {dev} | {batch} |{flag}')
+ for e in ends:
+ print(f"end: pure {e['pure_resident_mib']} MiB resident, {e['pure_state_mib']} MiB states "
+ f"(x{e['pure_resident_mib'] / max(e['pure_state_mib'], 0.1):.2f}), store {e['pure_store_mib']} MiB, "
+ f"sqlite {e['sqlite_files_mib']} / {e['grouped_sqlite_files_mib']} MiB, {e['pure_counts']}")
+ print()
+
+
+for name in sys.argv[1:] or ['ram-w1', 'ram-w4', 'sd-w1-*', 'sd-w4-*']:
+ table(name, name.startswith('sd'))