Skip to content

Commit 7b2f2a5

Browse files
committed
Update benchmark results and scripts for vector index and search matrices
- Updated benchmark results for vector index build and search across all datasets to reflect new version 26.4.1.dev0. - Modified dataset configurations in scripts to use "stackoverflow-medium" with increased transaction counts and memory limits. - Enhanced scripts to include memory limit in target directory naming for better clarity in results. - Adjusted summary scripts to capture and display memory limit alongside other metrics for comprehensive reporting.
1 parent 6407c68 commit 7b2f2a5

21 files changed

Lines changed: 447 additions & 179 deletions

bindings/python/examples/07_stackoverflow_tables_oltp.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,20 @@ def to_arcadedb_sql_value(value: Any) -> Any:
209209
SQLITE_PROFILE_CHOICES = ["fair", "perf", "olap"]
210210

211211

212-
def build_benchmark_db_name(dataset: str, db: str, run_label: Optional[str]) -> str:
212+
def mem_limit_tag(mem_limit: str) -> str:
213+
normalized = re.sub(r"[^0-9a-z]+", "", mem_limit.lower())
214+
return f"mem{normalized}" if normalized else "memdefault"
215+
216+
217+
def build_benchmark_db_name(
218+
dataset: str,
219+
db: str,
220+
run_label: Optional[str],
221+
mem_limit: Optional[str] = None,
222+
) -> str:
213223
db_name = f"{dataset.replace('-', '_')}_tables_oltp_{db}"
224+
if mem_limit:
225+
db_name = f"{db_name}_{mem_limit_tag(mem_limit)}"
214226
if run_label:
215227
db_name = f"{db_name}_{run_label}"
216228
return db_name
@@ -2080,7 +2092,12 @@ def run_in_docker(args):
20802092
inner_cmd_parts.append(f'uv pip install "{arcadedb_wheel_mount_path}"')
20812093
inner_cmd_parts.append("echo 'Starting benchmark...'")
20822094
if args.db == "postgresql":
2083-
db_name = build_benchmark_db_name(args.dataset, args.db, args.run_label)
2095+
db_name = build_benchmark_db_name(
2096+
args.dataset,
2097+
args.db,
2098+
args.run_label,
2099+
args.mem_limit,
2100+
)
20842101
inner_cmd_parts.append(
20852102
"status=0; "
20862103
f"{python_cmd} -u 07_stackoverflow_tables_oltp.py {' '.join(filtered_args)} "
@@ -2222,7 +2239,12 @@ def main():
22222239
if not xml_path.exists():
22232240
raise FileNotFoundError(f"{table['xml']} not found in {data_dir}")
22242241

2225-
db_name = build_benchmark_db_name(args.dataset, args.db, args.run_label)
2242+
db_name = build_benchmark_db_name(
2243+
args.dataset,
2244+
args.db,
2245+
args.run_label,
2246+
args.mem_limit,
2247+
)
22262248
db_path = Path("./my_test_databases") / db_name
22272249

22282250
print("=" * 80)

bindings/python/examples/08_stackoverflow_tables_olap.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,20 @@
4242
SQLITE_PROFILE_CHOICES = ["fair", "perf", "olap"]
4343

4444

45-
def build_benchmark_db_name(dataset: str, db: str, run_label: Optional[str]) -> str:
45+
def mem_limit_tag(mem_limit: str) -> str:
46+
normalized = re.sub(r"[^0-9a-z]+", "", mem_limit.lower())
47+
return f"mem{normalized}" if normalized else "memdefault"
48+
49+
50+
def build_benchmark_db_name(
51+
dataset: str,
52+
db: str,
53+
run_label: Optional[str],
54+
mem_limit: Optional[str] = None,
55+
) -> str:
4656
db_name = f"{dataset.replace('-', '_')}_tables_olap_{db}"
57+
if mem_limit:
58+
db_name = f"{db_name}_{mem_limit_tag(mem_limit)}"
4759
if run_label:
4860
db_name = f"{db_name}_{run_label}"
4961
return db_name
@@ -1392,7 +1404,12 @@ def run_in_docker(args):
13921404
f"{python_cmd} -u 08_stackoverflow_tables_olap.py {' '.join(filtered_args)}"
13931405
)
13941406
if args.db == "postgresql":
1395-
db_name = build_benchmark_db_name(args.dataset, args.db, args.run_label)
1407+
db_name = build_benchmark_db_name(
1408+
args.dataset,
1409+
args.db,
1410+
args.run_label,
1411+
args.mem_limit,
1412+
)
13961413
inner_cmd_parts.append(
13971414
"chown -R $HOST_UID:$HOST_GID "
13981415
f"/workspace/bindings/python/examples/my_test_databases/{db_name}"
@@ -2098,7 +2115,12 @@ def main():
20982115
data_dir = Path(__file__).parent / "data" / args.dataset
20992116
ensure_dataset(data_dir)
21002117

2101-
db_name = build_benchmark_db_name(args.dataset, args.db, args.run_label)
2118+
db_name = build_benchmark_db_name(
2119+
args.dataset,
2120+
args.db,
2121+
args.run_label,
2122+
args.mem_limit,
2123+
)
21022124
db_path = Path("./my_test_databases") / db_name
21032125

21042126
print("=" * 80)

bindings/python/examples/09_stackoverflow_graph_oltp.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@
6161
}
6262
SQLITE_PROFILE_CHOICES = ["fair", "perf", "olap"]
6363

64+
65+
def mem_limit_tag(mem_limit: str) -> str:
66+
normalized = re.sub(r"[^0-9a-z]+", "", mem_limit.lower())
67+
return f"mem{normalized}" if normalized else "memdefault"
68+
69+
6470
READ_TARGET_KINDS = [
6571
"user",
6672
"question",
@@ -7934,7 +7940,10 @@ def main():
79347940
f"Dataset not found: {data_dir}. Run download_data.py first."
79357941
)
79367942

7937-
db_name = f"{args.dataset.replace('-', '_')}_graph_oltp_{args.db}"
7943+
db_name = (
7944+
f"{args.dataset.replace('-', '_')}_graph_oltp_{args.db}_"
7945+
f"{mem_limit_tag(args.mem_limit)}"
7946+
)
79387947
if args.run_label:
79397948
db_name = f"{db_name}_{args.run_label}"
79407949
db_path = Path("./my_test_databases") / db_name

bindings/python/examples/10_stackoverflow_graph_olap.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@
4343

4444
SQLITE_PROFILE_CHOICES = ["fair", "perf", "olap"]
4545

46+
47+
def mem_limit_tag(mem_limit: str) -> str:
48+
normalized = re.sub(r"[^0-9a-z]+", "", mem_limit.lower())
49+
return f"mem{normalized}" if normalized else "memdefault"
50+
51+
4652
BENCHMARK_SCOPE_NOTE = (
4753
"Scope: OLAP query fairness on a common query suite. "
4854
"Ingestion paths differ by engine (ArcadeDB uses Cypher inserts, Ladybug uses staged CSV + COPY), "
@@ -5145,7 +5151,10 @@ def main():
51455151
f"Dataset not found: {data_dir}. Run download_data.py first."
51465152
)
51475153

5148-
db_name = f"{args.dataset.replace('-', '_')}_graph_olap_{args.db}"
5154+
db_name = (
5155+
f"{args.dataset.replace('-', '_')}_graph_olap_{args.db}_"
5156+
f"{mem_limit_tag(args.mem_limit)}"
5157+
)
51495158
if args.run_label:
51505159
db_name = f"{db_name}_{args.run_label}"
51515160
db_path = Path("./my_test_databases") / db_name

bindings/python/examples/11_vector_index_build.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,11 @@ def heap_tag_from_args(heap_size: str | None, jvm_args: str | None) -> str:
246246
return "default"
247247

248248

249+
def size_tag(value: str) -> str:
250+
normalized = re.sub(r"[^0-9a-z]+", "", value.lower())
251+
return normalized or "default"
252+
253+
249254
def _match_label(pattern: re.Pattern[str], name: str) -> str | None:
250255
m = pattern.match(name)
251256
if m:
@@ -1770,6 +1775,7 @@ def main() -> None:
17701775
f"backend={args.backend}",
17711776
f"dataset={args.dataset}",
17721777
f"label={label}",
1778+
f"mem={size_tag(args.mem_limit)}",
17731779
f"heap={heap_tag}",
17741780
f"maxconn={args.max_connections}",
17751781
f"beam={args.beam_width}",

bindings/python/examples/benchmark_results/summary_07_tables_oltp_all_datasets.md

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 07 Tables OLTP Matrix Summary — All Dataset Sizes
22

3-
- Generated (UTC): 2026-03-10T20:52:42Z
3+
- Generated (UTC): 2026-03-10T21:52:43Z
44
- Dataset: all
55
- Dataset size profile: all
66
- Label prefix: sweep07
@@ -88,28 +88,28 @@
8888

8989
| db | run_label | seed | threads | transactions | batch_size | mem_limit | preload_rows_total | preload_time_s | index_time_s | oltp_crud_time_s | throughput_s | p95_ms | rss_peak_mib | du_mib |
9090
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
91-
| arcadedb_sql | sweep07_t01_r01_arcadedb_sql_s00000 | 0 | 1 | 10,000 | 1,000 | 1g | 70,668 | 5.126 | 1.127 | 13.264 | 753.932 | 5.437 | 335.082 | 30.691 |
92-
| duckdb | sweep07_t01_r01_duckdb_s00002 | 2 | 1 | 10,000 | 1,000 | 1g | 70,668 | 1.124 | 0.041 | 21.21 | 471.478 | 6.107 | 236.801 | 64.781 |
93-
| postgresql | sweep07_t01_r01_postgresql_s00003 | 3 | 1 | 10,000 | 1,000 | 1g | 70,668 | 1.01 | 0.047 | 5.449 | 1,835.107 | 2.767 | 253.004 | 131.66 |
94-
| sqlite | sweep07_t01_r01_sqlite_s00001 | 1 | 1 | 10,000 | 1,000 | 1g | 70,668 | 16.234 | 0.024 | 0.252 | 39,698.197 | 0.055 | 38.008 | 29.613 |
91+
| arcadedb_sql | sweep07_t01_r01_arcadedb_sql_s00000 | 0 | 1 | 10,000 | 1,000 | 1g | 70,668 | 4.656 | 1.001 | 8.597 | 1,163.156 | 0.797 | 435.43 | 30.684 |
92+
| duckdb | sweep07_t01_r01_duckdb_s00002 | 2 | 1 | 10,000 | 1,000 | 1g | 70,668 | 1.256 | 0.211 | 18.553 | 539.006 | 5.459 | 238.148 | 64.031 |
93+
| postgresql | sweep07_t01_r01_postgresql_s00003 | 3 | 1 | 10,000 | 1,000 | 1g | 70,668 | 3.891 | 0.048 | 6.628 | 1,508.653 | 3.101 | 250.281 | 131.656 |
94+
| sqlite | sweep07_t01_r01_sqlite_s00001 | 1 | 1 | 10,000 | 1,000 | 1g | 70,668 | 1.956 | 0.021 | 0.24 | 41,606.188 | 0.057 | 38.039 | 29.613 |
9595

9696
### Per-operation OLTP details
9797

9898
| db | run_label | op | count | throughput_s | p50_ms | p95_ms | p99_ms |
9999
|---|---|---|---|---|---|---|---|
100-
| arcadedb_sql | sweep07_t01_r01_arcadedb_sql_s00000 | read | 5,977 | 450.625 | 0.068 | 0.399 | 0.814 |
101-
| arcadedb_sql | sweep07_t01_r01_arcadedb_sql_s00000 | update | 2,017 | 152.068 | 0.138 | 3.171 | 5.415 |
102-
| arcadedb_sql | sweep07_t01_r01_arcadedb_sql_s00000 | insert | 1,049 | 79.087 | 0.244 | 22.124 | 40.758 |
103-
| arcadedb_sql | sweep07_t01_r01_arcadedb_sql_s00000 | delete | 957 | 72.151 | 0.334 | 23.057 | 32.523 |
104-
| duckdb | sweep07_t01_r01_duckdb_s00002 | read | 6,047 | 285.103 | 0.376 | 0.744 | 0.964 |
105-
| duckdb | sweep07_t01_r01_duckdb_s00002 | update | 1,981 | 93.4 | 4.645 | 6.339 | 8.446 |
106-
| duckdb | sweep07_t01_r01_duckdb_s00002 | insert | 984 | 46.393 | 5.129 | 8.284 | 10.134 |
107-
| duckdb | sweep07_t01_r01_duckdb_s00002 | delete | 988 | 46.582 | 4.441 | 6.167 | 8.209 |
108-
| postgresql | sweep07_t01_r01_postgresql_s00003 | read | 6,041 | 1,108.588 | 0.053 | 0.104 | 0.153 |
109-
| postgresql | sweep07_t01_r01_postgresql_s00003 | update | 1,906 | 349.771 | 0.85 | 3.604 | 3.958 |
110-
| postgresql | sweep07_t01_r01_postgresql_s00003 | insert | 1,035 | 189.934 | 0.889 | 3.801 | 4.06 |
111-
| postgresql | sweep07_t01_r01_postgresql_s00003 | delete | 1,018 | 186.814 | 0.866 | 3.666 | 4.023 |
112-
| sqlite | sweep07_t01_r01_sqlite_s00001 | read | 6,021 | 23,902.285 | 0.008 | 0.014 | 0.02 |
113-
| sqlite | sweep07_t01_r01_sqlite_s00001 | update | 1,959 | 7,776.877 | 0.014 | 0.023 | 0.034 |
114-
| sqlite | sweep07_t01_r01_sqlite_s00001 | insert | 987 | 3,918.212 | 0.025 | 0.046 | 0.068 |
115-
| sqlite | sweep07_t01_r01_sqlite_s00001 | delete | 1,033 | 4,100.824 | 0.051 | 0.102 | 0.146 |
100+
| arcadedb_sql | sweep07_t01_r01_arcadedb_sql_s00000 | read | 5,977 | 695.218 | 0.078 | 0.287 | 0.691 |
101+
| arcadedb_sql | sweep07_t01_r01_arcadedb_sql_s00000 | update | 2,017 | 234.608 | 0.155 | 2.564 | 6.554 |
102+
| arcadedb_sql | sweep07_t01_r01_arcadedb_sql_s00000 | insert | 1,049 | 122.015 | 0.284 | 19.074 | 53.479 |
103+
| arcadedb_sql | sweep07_t01_r01_arcadedb_sql_s00000 | delete | 957 | 111.314 | 0.379 | 19.626 | 28.874 |
104+
| duckdb | sweep07_t01_r01_duckdb_s00002 | read | 6,047 | 325.937 | 0.366 | 0.784 | 1.03 |
105+
| duckdb | sweep07_t01_r01_duckdb_s00002 | update | 1,981 | 106.777 | 3.355 | 6.566 | 8.306 |
106+
| duckdb | sweep07_t01_r01_duckdb_s00002 | insert | 984 | 53.038 | 4.151 | 7.618 | 10.223 |
107+
| duckdb | sweep07_t01_r01_duckdb_s00002 | delete | 988 | 53.254 | 3.207 | 6.286 | 8.133 |
108+
| postgresql | sweep07_t01_r01_postgresql_s00003 | read | 6,041 | 911.377 | 0.065 | 0.166 | 0.33 |
109+
| postgresql | sweep07_t01_r01_postgresql_s00003 | update | 1,906 | 287.549 | 0.898 | 3.763 | 4.906 |
110+
| postgresql | sweep07_t01_r01_postgresql_s00003 | insert | 1,035 | 156.146 | 0.963 | 3.777 | 4.418 |
111+
| postgresql | sweep07_t01_r01_postgresql_s00003 | delete | 1,018 | 153.581 | 0.912 | 3.725 | 4.842 |
112+
| sqlite | sweep07_t01_r01_sqlite_s00001 | read | 6,021 | 25,051.086 | 0.008 | 0.015 | 0.022 |
113+
| sqlite | sweep07_t01_r01_sqlite_s00001 | update | 1,959 | 8,150.652 | 0.014 | 0.025 | 0.036 |
114+
| sqlite | sweep07_t01_r01_sqlite_s00001 | insert | 987 | 4,106.531 | 0.025 | 0.05 | 0.072 |
115+
| sqlite | sweep07_t01_r01_sqlite_s00001 | delete | 1,033 | 4,297.919 | 0.053 | 0.111 | 0.148 |

0 commit comments

Comments
 (0)