Skip to content

Performance Benchmark Comparison — Baseline vs Optimized

Performance Benchmark Comparison — Baseline vs Optimized

Test Configuration

  • Debug build (unoptimized + debuginfo)
  • Schema: 5 tables (customers 100, products 50, orders 200, order_items 500, categories 20)
  • 35 SQL categories, 20 iterations each
  • Deployment: Embedded/In-Memory

Summary of Improvements Implemented

#ImprovementFiles ChangedImpact
1EXISTS semi-join hash optimizationexecutor/mod.rs33.7x faster EXISTS subqueries
2LIKE prefix/suffix/contains fast-pathevaluator.rs47x faster LIKE patterns
3Fix EXPLAIN ANALYZE 0ms timeoutexecutor/explain.rsEXPLAIN ANALYZE now works
4Fix UPSERT column resolutionlib.rsUPSERT now works
5Fix UPDATE with subquery in SET clauselib.rs, executor/mod.rsUPDATE w/subquery now works
6Implement INSERT…SELECTlib.rs, planner.rs, logical_plan.rsNew SQL feature
7Implement RESET statement in query()lib.rsRESET now works via query() API
8Optimize VIEW DDL (plan.schema())executor/mod.rs831x faster CREATE VIEW
9Optimize REFRESH MV (bulk_load_mode)executor/phase3.rsMinimal effect (I/O-bound)
10Wire recursive optimizer ruleslib.rsPushdown/pruning rules fire
11Cost-based optimizer skip for simple plansoptimizer/mod.rsEliminates JOIN regressions
12LIKE underscore wildcard fast-pathevaluator.rsHandles _ without regex

Comparison Table (Embedded/In-Memory, avg per query)

#CategoryBaselineAfter AllChangeKey Improvement
1CREATE TABLE156us160us+3%
2CREATE INDEX47us49us+4%
3ALTER TABLE80us81us+1%
4DROP TABLE153us160us+5%
5CREATE/DROP VIEW123.81ms149us-99.9%#8 plan.schema() (831x)
6REFRESH MV284.07ms289ms+2%#9 bulk_load (no effect)
7TRUNCATE214us229us+7%
8INSERT single216us243us+13%
9INSERT multi-row780us803us+3%
10INSERT…SELECTFAILED404msFIXED#6 new feature
11UPDATE point1.28ms1.27ms-1%
12DELETE point338us333us-1%
13UPSERTFAILED123msFIXED#4 schema fix
14UPDATE w/subqueryFAILED2.03sFIXED#5 subquery materialization
15Point lookup1.43ms421us-71%#10 recursive optimizer (3.4x)
16Full scan + filter1.54ms1.13ms-27%#10 predicate pushdown
17Aggregation1.65ms1.63ms-1%cost-based skip
18INNER JOIN4.64ms4.62ms0%cost-based skip (was +32%)
19LEFT JOIN4.52ms4.64ms+3%cost-based skip (was +42%)
20Multi-table JOIN (4)14.68ms15.13ms+3%cost-based skip (was +27%)
21Scalar subquery42.40ms42.10ms-1%
22EXISTS subquery185.14ms5.50ms-97.0%#1 semi-join (33.7x)
23IN subquery3.48ms3.52ms+1%
24CTE6.79ms6.85ms+1%cost-based skip (was +15%)
25Recursive CTE1.97ms2.01ms+2%cost-based skip (was +15%)
26Window functions1.55ms1.22ms-21%
27UNION2.68ms2.73ms+2%
28DISTINCT1.50ms1.54ms+3%
29ORDER BY + LIMIT2.14ms2.18ms+2%
30CASE expressions1.79ms1.49ms-17%
31JSON-like filter1.60ms1.26ms-21%
32LIKE/BETWEEN/IN90.16ms1.90ms-97.9%#2 LIKE fast-path (47x)
33Transaction control220us231us+5%
34Prepared statements175us182us+4%
35SET/SHOW/RESETFAILED~125usFIXED#7 RESET in query()

Key Results

Big Wins (targeted improvements)

  • EXISTS subquery: 185ms -> 5.5ms (33.7x) — Semi-join hash optimization replaces O(NxM) nested loop with O(N+M) hash build + O(1) probes
  • LIKE/BETWEEN/IN: 90ms -> 1.9ms (47x) — Fast-path string ops (starts_with/ends_with/contains) avoid regex compilation; underscore wildcards handled with char-by-char matching
  • CREATE/DROP VIEW: 124ms -> 149us (831x) — Use plan.schema() to derive column types instead of executing the full view query
  • Point lookup: 1.43ms -> 421us (3.4x) — Recursive optimizer fires predicate pushdown and projection pruning

Bug Fixes (previously FAILED categories now working)

  • INSERT…SELECT: New SQL feature, 404ms per query
  • UPSERT (ON CONFLICT DO UPDATE): Fixed schema columns missing source_table_name
  • UPDATE with subquery in SET: Subqueries in SET clause now materialized per-row
  • SET/SHOW/RESET: RESET now handled before sqlparser in query() path

Cost-Based Optimizer Skip (eliminates regressions)

  • Simple plans (no joins) use single root-level optimize() instead of walking entire tree
  • Complex plans with joins still get full recursive bottom-up optimization
  • Result: JOINs back to baseline (+0-3%), aggregation/CTE regressions eliminated
  • Previously: JOINs were 27-42% slower, aggregation +24%, CTE +15%

Unchanged

  • DDL operations (CREATE/ALTER/DROP TABLE) unchanged
  • INSERT/DELETE point operations unchanged
  • REFRESH MV: bulk_load_mode had minimal effect (I/O-dominated by storage operations)