Skip to main content

vs Kuzu

LoraDB vs Kuzu

LoraDB leads by 3.30× overall. Kuzu is an embedded columnar graph engine. Numbers from the same suite as the overview — identical fixtures, identical seed, identical iteration count.

81 comparable workloads1 omissions12 groups
3.30×slower
Kuzu vs LoraDB overall
Geometric-mean slowdown across the full suite.
54/ 81
Workloads won by LoraDB
Kuzu wins 18; 9 go to a third engine.
15close calls
Within ~10% on both sides
Workloads where neither engine ran away with the row.

Overall

LoraDB sets the row; Kuzu sits at 3.30× slower.

Geometric-mean slowdown across every workload both engines run. Empty rows happen when the language can’t express the workload — they’re called out below, not hidden.

Per group

Wins by group.

For each group, the workload count, who wins it, and how the per-row tally breaks down between LoraDB, Kuzu, and any third engine that took a row.

  • setup1 workload · winner Grafeo
    LoraDB2.70× slower
    Kuzu700× slower
    Rows · 10·0·1
  • writes8 workloads · winner Grafeo
    LoraDB0.61× slower
    Kuzu1.79× slower
    Rows · 83·1·4
  • scans6 workloads · winner LoraDB
    LoraDBfastest
    Kuzu6.37× slower
    Rows · 65·1
  • predicates12 workloads · winner LoraDB
    LoraDBfastest
    Kuzu1.14× slower
    Rows · 128·2·2
  • strings5 workloads · winner Kuzu
    LoraDB1.22× slower
    Kuzufastest
    Rows · 50·5
  • numerics6 workloads · winner Kuzu
    LoraDB1.08× slower
    Kuzufastest
    Rows · 61·5
  • aggregates9 workloads · winner LoraDB
    LoraDBfastest
    Kuzu3.18× slower
    Rows · 98·0·1
  • pipeline9 workloads · winner LoraDB
    LoraDBfastest
    Kuzu1.27× slower
    Rows · 95·3·1
  • lists3 workloads · winner LoraDB
    LoraDBfastest
    Kuzu11.3× slower
    Rows · 32·1
  • sort3 workloads · winner LoraDB
    LoraDBfastest
    Kuzu1.41× slower
    Rows · 33·0
  • traversals15 workloads · winner LoraDB
    LoraDBfastest
    Kuzu20.4× slower
    Rows · 1515·0
  • patterns4 workloads · winner LoraDB
    LoraDBfastest
    Kuzu2.80× slower
    Rows · 44·0

Per workload

Raw timings, workload by workload.

Two columns — LoraDB and Kuzu — across every workload they share. Rows with no comparable Kuzurun are hidden here; they’re listed in the omissions block at the bottom.

setup(1)

WinnerGrafeo
WorkloadSizeLoraDBKuzuWinner
construct_empty4.06 µs2.70× slower1.05 ms700× slowerGrafeo

writes(8)

WinnerGrafeo
WorkloadSizeLoraDBKuzuWinner
bulk_edges200606.63 µsfastest2.01 ms3.31× slowerLoraDB
bulk_set_match1000552.39 µs1.84× slower300.03 µsfastestKuzu
delete_node1000355.70 µs1.47× slower598.35 µs2.48× slowerGrafeo
merge_create1000112.57 µs1.25× slower670.68 µs7.45× slowerGrafeo
merge_existing100023.95 µs2.89× slower162.06 µs19.6× slowerGrafeo
set_multiple_props100021.15 µsfastest169.72 µs8.03× slowerLoraDB
update_set100018.01 µsfastest188.62 µs10.5× slowerLoraDB
write_bulk10001.46 ms1.93× slower2.76 ms3.65× slowerGrafeo

scans(6)

WinnerLoraDB
WorkloadSizeLoraDBKuzuWinner
distinct1000198.38 µsfastest448.06 µs2.26× slowerLoraDB
lookup_by_id1000716.64 nsfastest116.07 µs162× slowerLoraDB
lookup_by_id_indexed1000684.00 nsfastest116.18 µs170× slowerLoraDB
range_filter1000199.70 µs1.04× slower192.68 µsfastestKuzu
scan_filtered1000149.08 µsfastest158.49 µs1.06× slowerLoraDB
scan_label1000124.96 µsfastest131.34 µs1.05× slowerLoraDB

predicates(12)

WinnerLoraDB
WorkloadSizeLoraDBKuzuWinner
where_compound_and_or1000213.07 µsfastest230.83 µs1.08× slowerLoraDB
where_contains1000145.04 µsfastest166.24 µs1.15× slowerLoraDB
where_ends_with1000143.60 µsfastest167.41 µs1.17× slowerLoraDB
where_id_in_range1000142.71 µs2.02× slower187.97 µs2.66× slowerGrafeo
where_in_list1000162.42 µsfastest196.06 µs1.21× slowerLoraDB
where_modulo_eq1000127.32 µsfastest167.83 µs1.32× slowerLoraDB
where_not1000166.05 µs1.01× slower164.07 µsfastestKuzu
where_or1000147.16 µsfastest185.19 µs1.26× slowerLoraDB
where_starts_with1000146.91 µsfastest168.08 µs1.14× slowerLoraDB
where_string_gte1000180.97 µs1.07× slower168.40 µsfastestKuzu
where_subexpr1000227.59 µs1.69× slower194.85 µs1.45× slowerSurrealDB
where_two_props1000152.69 µsfastest205.41 µs1.35× slowerLoraDB

strings(5)

WinnerKuzu
WorkloadSizeLoraDBKuzuWinner
string_concat1000186.55 µs1.27× slower147.24 µsfastestKuzu
string_size1000172.17 µs1.10× slower156.38 µsfastestKuzu
string_substring1000210.20 µs1.21× slower173.57 µsfastestKuzu
string_to_lower1000201.00 µs1.33× slower151.22 µsfastestKuzu
string_to_upper1000185.41 µs1.22× slower151.96 µsfastestKuzu

numerics(6)

WinnerKuzu
WorkloadSizeLoraDBKuzuWinner
numeric_abs1000174.85 µs1.13× slower154.99 µsfastestKuzu
numeric_ceil1000171.69 µs1.10× slower155.40 µsfastestKuzu
numeric_floor1000175.48 µs1.10× slower159.62 µsfastestKuzu
numeric_modulo1000144.95 µs1.02× slower142.67 µsfastestKuzu
numeric_pow1000166.22 µs1.16× slower143.34 µsfastestKuzu
numeric_round1000180.68 µsfastest181.69 µs1.01× slowerLoraDB

aggregates(9)

WinnerLoraDB
WorkloadSizeLoraDBKuzuWinner
aggregate_avg100081.43 µsfastest253.54 µs3.11× slowerLoraDB
aggregate_collect100078.90 µsfastest275.13 µs3.49× slowerLoraDB
aggregate_count100059.50 µs2.77× slower250.00 µs11.7× slowerGrafeo
aggregate_count_distinct1000104.05 µsfastest441.70 µs4.24× slowerLoraDB
aggregate_max100079.97 µsfastest263.33 µs3.29× slowerLoraDB
aggregate_min100079.67 µsfastest258.01 µs3.24× slowerLoraDB
aggregate_sum100078.09 µsfastest263.06 µs3.37× slowerLoraDB
grouped_aggregation1000154.46 µsfastest549.19 µs3.56× slowerLoraDB
top_k1000186.50 µsfastest248.58 µs1.33× slowerLoraDB

pipeline(9)

WinnerLoraDB
WorkloadSizeLoraDBKuzuWinner
case_when1000173.33 µsfastest186.25 µs1.07× slowerLoraDB
coalesce_existing1000161.92 µsfastest162.41 µs1.00× slowerLoraDB
computed_in_return1000151.15 µs1.07× slower140.92 µsfastestKuzu
distinct_with_order1000508.01 µs2.08× slower549.89 µs2.25× slowerGrafeo
predicate_via_function1000238.39 µs1.38× slower172.38 µsfastestKuzu
with_aggregate_then_filter1000148.70 µsfastest475.77 µs3.20× slowerLoraDB
with_distinct_then_count1000202.72 µsfastest540.85 µs2.67× slowerLoraDB
with_pipeline1000186.41 µsfastest333.60 µs1.79× slowerLoraDB
with_two_chained1000313.64 µs1.41× slower222.76 µsfastestKuzu

lists(3)

WinnerLoraDB
WorkloadSizeLoraDBKuzuWinner
list_in_construction1000177.94 µs1.05× slower168.89 µsfastestKuzu
list_unwind_explicit10001.11 µsfastest165.87 µs149× slowerLoraDB
range_function100018.86 µsfastest193.49 µs10.3× slowerLoraDB

sort(3)

WinnerLoraDB
WorkloadSizeLoraDBKuzuWinner
order_by_id_asc1000167.95 µsfastest234.56 µs1.40× slowerLoraDB
order_by_multi_key1000211.99 µsfastest276.69 µs1.31× slowerLoraDB
skip_limit1000162.19 µsfastest251.28 µs1.55× slowerLoraDB

traversals(15)

WinnerLoraDB
WorkloadSizeLoraDBKuzuWinner
direct_record_traversal500831.70 nsfastest255.86 µs308× slowerLoraDB
recursive_depth2500968.69 nsfastest499.89 µs516× slowerLoraDB
recursive_depth35001.04 µsfastest540.33 µs520× slowerLoraDB
recursive_depth55001.16 µsfastest511.05 µs440× slowerLoraDB
relation_filter500117.78 µsfastest406.36 µs3.45× slowerLoraDB
traversal_count_one_hop50059.36 µsfastest288.00 µs4.85× slowerLoraDB
traversal_filter_one_hop500138.99 µsfastest405.25 µs2.92× slowerLoraDB
traversal_one_hop500125.98 µsfastest360.18 µs2.86× slowerLoraDB
traversal_reverse500123.67 µsfastest365.12 µs2.95× slowerLoraDB
traversal_three_hop500236.10 µsfastest1.13 ms4.80× slowerLoraDB
traversal_two_hop500165.58 µsfastest649.69 µs3.92× slowerLoraDB
traversal_undirected500213.41 µsfastest492.51 µs2.31× slowerLoraDB
variable_length_path10086.24 µsfastest2.64 ms30.6× slowerLoraDB
varlen_2_to_5100123.74 µsfastest3.90 ms31.5× slowerLoraDB
varlen_exact_510056.89 µsfastest3.86 ms67.9× slowerLoraDB

patterns(4)

WinnerLoraDB
WorkloadSizeLoraDBKuzuWinner
edge_subquery_clause500213.55 µsfastest465.09 µs2.18× slowerLoraDB
star_fanout1000138.96 µsfastest296.68 µs2.13× slowerLoraDB
star_fanout_count100061.36 µsfastest290.42 µs4.73× slowerLoraDB
star_fanout_filter1000112.53 µsfastest312.37 µs2.78× slowerLoraDB

Honest omissions

Workloads Kuzu couldn’t run like-for-like.

Omissions

Workloads omitted only where the engine has no like-for-like equivalent — a missing scalar function, a different MERGE semantics, a reserved word. The reason is recorded with the workload, not silently dropped.

  • write_single
    Kuzu
    • Kuzu requires `CREATE NODE TABLE` before inserts; the empty fixture has no schema and adding one would change the iteration's measured cost.