GenericVectorBuilder

Benchmark

Vector search benchmark

In this public copy, machine names, network addresses and home-folder paths are replaced; the checksums in the results refer to the unredacted run files.

Numbers from published-2026-10-08.

redis had the lowest p50 latency: every other engine took at least 1.45 times as long, in each session; redis holds its data in memory.

sources
  • consolidated consolidated:threshold.tBp|bp-ratio = 1.45
  • consolidated consolidated:metrics[metric=p50Ms].rows[0].target = redis
  • doc doc:design/engine-docs/redis-faq-2026-10-07.html#Redis is an in-memory but persistent on disk database = Redis is an in-memory but persistent on disk database

Data: eshoponweb, 524 vectors of 1024 dimensions; 20 queries, top 10 hits each.

sources
  • results results:pipeline = eshoponweb
  • results results:rows = 524
  • results results:dimension = 1024
  • results results:queryCount = 20
  • results results:top = 10

Machine: Intel(R) Xeon(R) CPU E5-1620 v3 @ 3.50GHz, 8 logical CPUs, 62.7 GiB of RAM.

sources
  • results results:machine.cpu = Intel(R) Xeon(R) CPU E5-1620 v3 @ 3.50GHz
  • results results:machine.logicalCpus = 8
  • results results:machine.ramGiB = 62.7

At 524 vectors each figure is the cost of one request through the benchmark's client for that engine, and does not show how an index scales.

sources
  • results results:rows = 524

Of the 19 engines, 8 are reached through the benchmark's own HttpClient REST code: elasticsearch, vespa, opensearch, chroma, milvus, typesense, clickhouse and weaviate.

sources
  • consolidated consolidated:targetCount = 19
  • consolidated consolidated:httpClientCount = 8
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ) = _data = new HttpClient( handler )
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/" = new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl

Session v7: runs 20261006-130619-eshoponweb, 20261006-142724-eshoponweb and 20261006-154837-eshoponweb, started from 2026-10-06T13:06:19Z to 2026-10-06T15:48:37Z.

sources
  • results results@20261006-130619-eshoponweb:startedUtc = 2026-10-06T13:06:19Z
  • results results@20261006-142724-eshoponweb:startedUtc = 2026-10-06T14:27:24Z
  • results results@20261006-154837-eshoponweb:startedUtc = 2026-10-06T15:48:37Z
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-130619-eshoponweb].folder = 20261006-130619-eshoponweb
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-142724-eshoponweb].folder = 20261006-142724-eshoponweb
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-154837-eshoponweb].folder = 20261006-154837-eshoponweb

Session v8: runs 20261007-205106-eshoponweb, 20261007-221429-eshoponweb and 20261007-233551-eshoponweb, started from 2026-10-07T20:51:06Z to 2026-10-07T23:35:51Z.

sources
  • results results@20261007-205106-eshoponweb:startedUtc = 2026-10-07T20:51:06Z
  • results results@20261007-221429-eshoponweb:startedUtc = 2026-10-07T22:14:29Z
  • results results@20261007-233551-eshoponweb:startedUtc = 2026-10-07T23:35:51Z
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-221429-eshoponweb].folder = 20261007-221429-eshoponweb
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-233551-eshoponweb].folder = 20261007-233551-eshoponweb

The runs of v8 were measured by build 9b924200abc3.

sources
  • results results@20261007-205106-eshoponweb:conditions.build.commit#9b924200abc3 = 9b924200abc3
  • results results@20261007-221429-eshoponweb:conditions.build.commit#9b924200abc3 = 9b924200abc3
  • results results@20261007-233551-eshoponweb:conditions.build.commit#9b924200abc3 = 9b924200abc3
  • consolidated consolidated:build.measured[1].session = v8

This report was consolidated by build 9e5878ce5dc0, not by the build that measured the runs of v8.

sources
  • consolidated consolidated:build.consolidatedBy.commitShort = 9e5878ce5dc0
  • consolidated consolidated:build.measured[session=v8].session = v8

The runs of v8 read a question file with the same SHA256 hash as design/bench-inputs/questions_golden.json.

sources
  • results results@20261007-205106-eshoponweb:queriesFileSha256 = e3a917ec8c5e687d2a2d6b83bc8ffd7eb901f0ffac8d8b277995b86898e9a712
  • results results@20261007-221429-eshoponweb:queriesFileSha256 = e3a917ec8c5e687d2a2d6b83bc8ffd7eb901f0ffac8d8b277995b86898e9a712
  • results results@20261007-233551-eshoponweb:queriesFileSha256 = e3a917ec8c5e687d2a2d6b83bc8ffd7eb901f0ffac8d8b277995b86898e9a712
  • consolidated consolidated:queries.copySha256 = e3a917ec8c5e687d2a2d6b83bc8ffd7eb901f0ffac8d8b277995b86898e9a712
  • file src/GenericVectorBuilder.Bench/Data/GoldenQueries.cs#Convert.ToHexString( SHA256.HashData( bytes ) ).ToLowerInvariant() = Convert.ToHexString( SHA256.HashData( bytes ) ).ToLowerInvariant()

The runs of v7 record no question-file hash, and truthNdcg reads 0.5181699774768911 in all 6 claim runs.

sources
  • results results:truthNdcg = 0.5181699774768911
  • consolidated consolidated:claimRunCount = 6
golden: 20 labelled questions from ~/ForClaude/evalkit/questions_golden.json, embedded with qwen3-emb-0.6b (cached in ~/gvb-data/bench-cache/golden-eshoponweb-68df42ca69efa079.json, no embedding calls)
sources
  • quote results@20261006-130619-eshoponweb:queries

Machine: CPU Intel(R) Xeon(R) CPU E5-1620 v3 @ 3.50GHz; Logical CPUs 8; RAM (GiB) 62.7; OS Ubuntu 24.04.5 LTS, kernel 6.8.0-142-generic; .NET .NET 10.0.12; Governor performance; Partition client 0-1,4-5; engines 2-3,6-7

Clock v7: pinned true; pinnedMhz 3500; noTurbo 1; uncore 0x1e1e; ceilingBeforeMhz 3600; toleranceBp 100; pinnedRatio 35; kernelMedianMhz 3492; kernelMinMhz 3492; kernelMaxMhz 3492; clockOffPasses 0; clockUnreadPasses 0; passesEvaluated 156; legacyParsed true (the clock was read from the runs' notes, not from a clock block)

Clock v8: pinned true; pinnedMhz 3500; noTurbo 1; uncore 0x1e1e; ceilingBeforeMhz 3600; toleranceBp 100; pinnedRatio 35; kernelMedianMhz 3492; kernelMinMhz 3492; kernelMaxMhz 3500; clockOffPasses 0; clockUnreadPasses 0; passesEvaluated 156; legacyParsed false

p50 latency of one search, milliseconds

Enginev7 min to maxv8 min to maxMedian of all runsSearchNot separated fromFlags
redis
redis holds its data in memory: its saved docs page says 'Redis is an in-memory but persistent on disk database', and its compose file sets save "300 1" and appendonly no.
sources
  • doc doc:design/engine-docs/redis-faq-2026-10-07.html#Redis is an in-memory but persistent on disk database = Redis is an in-memory but persistent on disk database
  • file deploy/engines/redis.compose.yaml#--save "300 1" = --save "300 1"
  • file deploy/engines/redis.compose.yaml#--appendonly no = --appendonly no
0.39 to 0.400.37 to 0.390.39approximate
recorded, documented
none
mariadb0.62 to 0.640.62 to 0.630.63approximate
measured
pgvector, qdrant, qdrant-hnsw, oracle
pgvector0.87 to 0.880.84 to 0.870.87approximate
measured
mariadb, qdrant, qdrant-hnsw, oracle, mongodb
qdrant0.88 to 0.890.890.89exact
measured
mariadb, pgvector, qdrant-hnsw, oracle, mongodb
qdrant-hnsw0.920.920.92approximate
measured
mariadb, pgvector, qdrant, oracle, elasticsearch, mongodb
oracle0.92 to 0.930.92 to 0.940.93approximate
measured
mariadb, pgvector, qdrant, qdrant-hnsw, elasticsearch, mongodb
elasticsearch1.31 to 1.331.31 to 1.321.32exact
measured
qdrant-hnsw, oracle, mongodb, sqlitevec, vespaIx
mongodb1.26 to 1.411.37 to 1.391.39approximate
recorded (engine's own report)
pgvector, qdrant, qdrant-hnsw, oracle, elasticsearch, sqlitevec, vespa, opensearchBzSl
sqlitevec1.91 to 1.931.86 to 1.921.91exact
measured
elasticsearch, mongodb, vespa, opensearch, chroma, milvus
vespa1.95 to 1.971.87 to 1.921.93approximate
measured
elasticsearch, mongodb, sqlitevec, opensearch, chroma, milvus
opensearch1.99 to 2.161.98 to 2.062.01approximate
measured
mongodb, sqlitevec, vespa, chroma, milvus
chroma2.112.07 to 2.122.11approximate
recorded, unverified
sqlitevec, vespa, opensearch, milvus
milvus2.32 to 2.342.23 to 2.252.28approximate
recorded, unverified
sqlitevec, vespa, opensearch, chroma
sql-diskann3.60 to 3.693.56 to 3.583.59approximate
measured
duckdb, sql, typesense, clickhouse
duckdb3.67 to 3.683.62 to 3.643.65approximate
measured
sql-diskann, sql, typesense, clickhouse
sql4.02 to 4.063.93 to 3.943.98exact
measured
sql-diskann, duckdb, typesense, clickhouse, weaviate
typesense4.18 to 4.204.16 to 4.184.18approximate
measured
sql-diskann, duckdb, sql, clickhouse, weaviate
clickhouse4.94 to 4.974.84 to 4.874.91approximate
measured
sql-diskann, duckdb, sql, typesense, weaviate
weaviate5.36 to 5.375.31 to 5.335.34approximate
recorded, unverified
sql, typesense, clickhouse

p50 is the median latency of one searcher's searches, in ms; rows are in order of the median of 6 runs.

sources
  • consolidated consolidated:runsShown = 6

Searches per second, one searcher

Enginev7 min to maxv8 min to maxMedian of all runsSearchNot separated fromFlags
redis
redis holds its data in memory: its saved docs page says 'Redis is an in-memory but persistent on disk database', and its compose file sets save "300 1" and appendonly no.
sources
  • doc doc:design/engine-docs/redis-faq-2026-10-07.html#Redis is an in-memory but persistent on disk database = Redis is an in-memory but persistent on disk database
  • file deploy/engines/redis.compose.yaml#--save "300 1" = --save "300 1"
  • file deploy/engines/redis.compose.yaml#--appendonly no = --appendonly no
2,519 to 2,5372,559 to 2,6182,548approximate
recorded, documented
none
mariadb1,546 to 1,5781,549 to 1,5761,558approximate
measured
pgvector, qdrant, qdrant-hnsw
pgvector1,107 to 1,1261,127 to 1,1581,126approximate
measured
mariadb, qdrant, qdrant-hnsw, oracle, mongodb
qdrant1,111 to 1,1181,103 to 1,1131,112exact
measured
mariadb, pgvector, qdrant-hnsw, oracle, mongodb
qdrant-hnsw1,071 to 1,0771,072 to 1,0751,075approximate
measured
mariadb, pgvector, qdrant, oracle, elasticsearch, mongodb
oracle1,042 to 1,0551,029 to 1,0601,050approximate
measured
pgvector, qdrant, qdrant-hnsw, elasticsearch, mongodb
elasticsearch739 to 748742 to 749745exact
measured
qdrant-hnsw, oracle, mongodb, sqlitevec, vespaIx
mongodb691 to 770705 to 717707approximate
recorded (engine's own report)
pgvector, qdrant, qdrant-hnsw, oracle, elasticsearch, sqlitevec, vespa, opensearchBzSl
sqlitevec506 to 514514 to 529514exact
measured
elasticsearch, mongodb, vespa, opensearch, chroma, milvus
vespa492 to 496503 to 517500approximate
measured
elasticsearch, mongodb, sqlitevec, opensearch, chroma, milvus
opensearch451 to 491480 to 495487approximate
measured
mongodb, sqlitevec, vespa, chroma, milvus
chroma469468 to 478469approximate
recorded, unverified
sqlitevec, vespa, opensearch, milvus
milvus405 to 409423 to 427416approximate
recorded, unverified
sqlitevec, vespa, opensearch, chroma
sql-diskann263 to 271275 to 278273approximate
measured
duckdb, sql, typesense, clickhouse
duckdb269 to 270272 to 274271approximate
measured
sql-diskann, sql, typesense, clickhouse
sql241 to 243245 to 250244exact
measured
sql-diskann, duckdb, typesense, clickhouse, weaviate
typesense235 to 236236 to 237236approximate
measured
sql-diskann, duckdb, sql, clickhouse, weaviate
clickhouse192 to 196194 to 200195approximate
measured
sql-diskann, duckdb, sql, typesense, weaviate
weaviate165 to 167167167approximate
recorded, unverified
sql, typesense, clickhouse

QPS@1 is searches per second of the same one-searcher pass as p50, so it is no second confirmation of the p50 order.

no sources recorded

Searches per second, eight searchers at once

Enginev7 min to maxv8 min to maxMedian of all runsSearchNot separated fromFlags
mariadb5,911 to 5,9205,926 to 5,9565,923approximate
measured
redis, pgvector
redis
redis holds its data in memory: its saved docs page says 'Redis is an in-memory but persistent on disk database', and its compose file sets save "300 1" and appendonly no.
sources
  • doc doc:design/engine-docs/redis-faq-2026-10-07.html#Redis is an in-memory but persistent on disk database = Redis is an in-memory but persistent on disk database
  • file deploy/engines/redis.compose.yaml#--save "300 1" = --save "300 1"
  • file deploy/engines/redis.compose.yaml#--appendonly no = --appendonly no
5,038 to 5,1205,237 to 5,2585,179approximate
recorded, documented
mariadb, pgvector
pgvector3,910 to 4,0014,006 to 4,0954,004approximate
measured
mariadb, redis, qdrant-hnsw, qdrant, oracle, elasticsearch
qdrant-hnsw3,440 to 3,4523,468 to 3,4773,460approximate
measured
pgvector, qdrant, oracle, elasticsearch
qdrant3,274 to 3,2873,280 to 3,2963,284exact
measured
pgvector, qdrant-hnsw, oracle, elasticsearch, mongodb
oracle2,655 to 2,8032,792 to 2,8322,803approximate
measured
pgvector, qdrant-hnsw, qdrant, elasticsearch, mongodb
elasticsearch2,669 to 2,7082,694 to 2,7322,701exact
measured
pgvector, qdrant-hnsw, qdrant, oracle, mongodbIx
mongodb2,066 to 2,3522,098 to 2,1502,123approximate
recorded (engine's own report)
qdrant, oracle, elasticsearch, vespa, opensearchSl
vespa1,506 to 1,5651,556 to 1,5821,560approximate
measured
mongodb, opensearch, milvus, sqlitevec
opensearch1,346 to 1,5161,462 to 1,5161,492approximate
measured
mongodb, vespa, milvus, sqlitevec
milvus1,255 to 1,2631,266 to 1,2741,264approximate
recorded, unverified
vespa, opensearch, sqlitevec
sqlitevec1,136 to 1,1421,131 to 1,1401,137exact
measured
vespa, opensearch, milvus, chroma
chroma777779 to 791778approximate
recorded, unverified
sqlitevec, sql-diskann, sql, duckdb, typesense
sql-diskann645 to 691668 to 695687approximate
measured
chroma, sql, duckdb, typesense
sql602 to 614580 to 607604exact
measured
chroma, sql-diskann, duckdb, typesense
duckdb576578 to 583577approximate
measured
chroma, sql-diskann, sql, typesense
typesense574 to 576572 to 576574approximate
measured
chroma, sql-diskann, sql, duckdb
weaviate305306306approximate
recorded, unverified
none
Not ranked
clickhouse375 to 428336 to 380378approximate
measured
not held, not rankedUnNh

QPS@8 is searches per second with 8 searchers at once.

sources
  • results results:concurrency[1] = 8

clickhouse is shown and not ranked in this table: its timed eight-searcher pass was recorded NOT HELD in 3 of the 6 runs.

sources
  • consolidated consolidated:notHeld.unranked[0].target = clickhouse
  • consolidated consolidated:notHeld.unranked[0].runs = 3
  • consolidated consolidated:runsShown = 6

p50 latency in exact mode, milliseconds

Enginev7 min to maxv8 min to maxMedian of all runsNot separated fromFlags
redis
redis holds its data in memory: its saved docs page says 'Redis is an in-memory but persistent on disk database', and its compose file sets save "300 1" and appendonly no.
sources
  • doc doc:design/engine-docs/redis-faq-2026-10-07.html#Redis is an in-memory but persistent on disk database = Redis is an in-memory but persistent on disk database
  • file deploy/engines/redis.compose.yaml#--save "300 1" = --save "300 1"
  • file deploy/engines/redis.compose.yaml#--appendonly no = --appendonly no
0.380.36 to 0.370.37none
qdrant-hnsw0.890.900.90mongodb, elasticsearch
mongodb1.24 to 1.261.21 to 1.241.24qdrant-hnsw, elasticsearch, mariadbBzSl
elasticsearch1.26 to 1.281.25 to 1.261.26qdrant-hnsw, mongodb, mariadbIx
mariadb1.63 to 1.641.61 to 1.631.63mongodb, elasticsearch, sqlitevec, vespa, pgvector
sqlitevec1.91 to 1.941.87 to 1.921.91mariadb, vespa, pgvector, oracle, opensearch
vespa1.93 to 1.961.87 to 1.921.93mariadb, sqlitevec, pgvector, oracle, opensearch
pgvector2.21 to 2.262.18 to 2.192.20mariadb, sqlitevec, vespa, oracle, opensearch
oracle2.48 to 2.502.42 to 2.492.48sqlitevec, vespa, pgvector, opensearch, sql-diskann
opensearch2.61 to 2.752.55 to 2.662.64sqlitevec, vespa, pgvector, oracle, sql-diskann
sql-diskann3.74 to 3.793.57 to 3.633.69oracle, opensearch, duckdb
duckdb4.19 to 4.214.10 to 4.164.18sql-diskann, typesense
typesense5.66 to 5.685.63 to 5.645.65duckdb, clickhouse
clickhouse6.66 to 6.686.60 to 6.636.64typesense

Exact p50 is the median latency of each engine's own exact mode, which is a different operation per engine; the why table's CPU figures come from the other passes.

no sources recorded

sql has no exact pass; its search fact says: no index used, exact scan by design.

sources
  • results results:targets[sql].indexState.afterLoad.detail#no index used, exact scan by design = no index used, exact scan by design

qdrant has no exact pass; its search fact says: no index used, exact scan by design.

sources
  • results results:targets[qdrant].indexState.afterLoad.detail#no index used, exact scan by design = no index used, exact scan by design

milvus has no exact pass in these runs.

no sources recorded

weaviate has no exact pass in these runs.

no sources recorded

chroma has no exact pass in these runs.

no sources recorded

Rows are in the order of the median of all runs. Among ranked rows, an engine is ahead of every engine below it that its row does not list, and behind every engine above it that its row does not list.

The search column gives the mode the report's search fact states for the engine, with the label that fact carries. The facts table below lists each fact with its source.

A row marked not held has figures from a timed pass the tool recorded as not held: the engine was still changing when it was timed. The row is shown and is not ranked.

A dash means the table has no figure there.

Flags

The small markers after an engine name are flags. Hover a marker for its evidence, or read the list below the tables.

Evidence behind the flags
  • elasticsearch p50Ms index-not-ready Run 20261006-130619-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch p50Ms index-not-ready Run 20261006-130619-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch p50Ms index-not-ready Run 20261006-142724-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch p50Ms index-not-ready Run 20261006-142724-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch p50Ms index-not-ready Run 20261006-154837-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch p50Ms index-not-ready Run 20261006-154837-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch p50Ms index-not-ready Run 20261007-205106-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch p50Ms index-not-ready Run 20261007-205106-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch p50Ms index-not-ready Run 20261007-221429-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch p50Ms index-not-ready Run 20261007-221429-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch p50Ms index-not-ready Run 20261007-233551-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch p50Ms index-not-ready Run 20261007-233551-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • mongodb p50Ms busy-box Run 20261006-154837-eshoponweb: busy box during the one-searcher pass, with 0.350 CPUs of outside load.
  • mongodb p50Ms segment-layout-differs Run 20261006-130619-eshoponweb: mongodb's index state after the searches reads 4 segment(s).
  • mongodb p50Ms segment-layout-differs Run 20261006-142724-eshoponweb: mongodb's index state after the searches reads 2 segment(s).
  • mongodb p50Ms segment-layout-differs Run 20261006-154837-eshoponweb: mongodb's index state after the searches reads 4 segment(s).
  • mongodb p50Ms segment-layout-differs Run 20261007-205106-eshoponweb: mongodb's index state after the searches reads 3 segment(s).
  • mongodb p50Ms segment-layout-differs Run 20261007-221429-eshoponweb: mongodb's index state after the searches reads 2 segment(s).
  • mongodb p50Ms segment-layout-differs Run 20261007-233551-eshoponweb: mongodb's index state after the searches reads 4 segment(s).
  • elasticsearch qps1 index-not-ready Run 20261006-130619-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps1 index-not-ready Run 20261006-130619-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps1 index-not-ready Run 20261006-142724-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps1 index-not-ready Run 20261006-142724-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps1 index-not-ready Run 20261006-154837-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps1 index-not-ready Run 20261006-154837-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps1 index-not-ready Run 20261007-205106-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps1 index-not-ready Run 20261007-205106-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps1 index-not-ready Run 20261007-221429-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps1 index-not-ready Run 20261007-221429-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps1 index-not-ready Run 20261007-233551-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps1 index-not-ready Run 20261007-233551-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • mongodb qps1 busy-box Run 20261006-154837-eshoponweb: busy box during the one-searcher pass, with 0.350 CPUs of outside load.
  • mongodb qps1 segment-layout-differs Run 20261006-130619-eshoponweb: mongodb's index state after the searches reads 4 segment(s).
  • mongodb qps1 segment-layout-differs Run 20261006-142724-eshoponweb: mongodb's index state after the searches reads 2 segment(s).
  • mongodb qps1 segment-layout-differs Run 20261006-154837-eshoponweb: mongodb's index state after the searches reads 4 segment(s).
  • mongodb qps1 segment-layout-differs Run 20261007-205106-eshoponweb: mongodb's index state after the searches reads 3 segment(s).
  • mongodb qps1 segment-layout-differs Run 20261007-221429-eshoponweb: mongodb's index state after the searches reads 2 segment(s).
  • mongodb qps1 segment-layout-differs Run 20261007-233551-eshoponweb: mongodb's index state after the searches reads 4 segment(s).
  • elasticsearch qps8 index-not-ready Run 20261006-130619-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps8 index-not-ready Run 20261006-130619-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps8 index-not-ready Run 20261006-142724-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps8 index-not-ready Run 20261006-142724-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps8 index-not-ready Run 20261006-154837-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps8 index-not-ready Run 20261006-154837-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps8 index-not-ready Run 20261007-205106-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps8 index-not-ready Run 20261007-205106-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps8 index-not-ready Run 20261007-221429-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps8 index-not-ready Run 20261007-221429-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps8 index-not-ready Run 20261007-233551-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch qps8 index-not-ready Run 20261007-233551-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • mongodb qps8 segment-layout-differs Run 20261006-130619-eshoponweb: mongodb's index state after the searches reads 4 segment(s).
  • mongodb qps8 segment-layout-differs Run 20261006-142724-eshoponweb: mongodb's index state after the searches reads 2 segment(s).
  • mongodb qps8 segment-layout-differs Run 20261006-154837-eshoponweb: mongodb's index state after the searches reads 4 segment(s).
  • mongodb qps8 segment-layout-differs Run 20261007-205106-eshoponweb: mongodb's index state after the searches reads 3 segment(s).
  • mongodb qps8 segment-layout-differs Run 20261007-221429-eshoponweb: mongodb's index state after the searches reads 2 segment(s).
  • mongodb qps8 segment-layout-differs Run 20261007-233551-eshoponweb: mongodb's index state after the searches reads 4 segment(s).
  • clickhouse qps8 unsettled Run 20261007-205106-eshoponweb: clickhouse was recorded as not settled before its timed eight-searcher pass.
  • clickhouse qps8 unsettled Run 20261007-221429-eshoponweb: clickhouse was recorded as not settled before its timed eight-searcher pass.
  • clickhouse qps8 unsettled Run 20261007-233551-eshoponweb: clickhouse was recorded as not settled before its timed eight-searcher pass.
  • clickhouse qps8 not-held Run 20261007-205106-eshoponweb: the timed eight-searcher pass of clickhouse read 336 QPS, 24% from the settled 418 QPS (limit 10%), and the run recorded it as NOT HELD.
  • clickhouse qps8 not-held Run 20261007-221429-eshoponweb: the timed eight-searcher pass of clickhouse read 380 QPS, 13% from the settled 432 QPS (limit 10%), and the run recorded it as NOT HELD.
  • clickhouse qps8 not-held Run 20261007-233551-eshoponweb: the timed eight-searcher pass of clickhouse read 349 QPS, 19% from the settled 416 QPS (limit 10%), and the run recorded it as NOT HELD.
  • mongodb exactP50Ms busy-box Run 20261006-130619-eshoponweb: busy box during the exact pass, with 0.307 CPUs of outside load.
  • mongodb exactP50Ms busy-box Run 20261006-142724-eshoponweb: busy box during the exact pass, with 0.317 CPUs of outside load.
  • mongodb exactP50Ms busy-box Run 20261006-154837-eshoponweb: busy box during the exact pass, with 0.301 CPUs of outside load.
  • mongodb exactP50Ms segment-layout-differs Run 20261006-130619-eshoponweb: mongodb's index state after the searches reads 4 segment(s).
  • mongodb exactP50Ms segment-layout-differs Run 20261006-142724-eshoponweb: mongodb's index state after the searches reads 2 segment(s).
  • mongodb exactP50Ms segment-layout-differs Run 20261006-154837-eshoponweb: mongodb's index state after the searches reads 4 segment(s).
  • mongodb exactP50Ms segment-layout-differs Run 20261007-205106-eshoponweb: mongodb's index state after the searches reads 3 segment(s).
  • mongodb exactP50Ms segment-layout-differs Run 20261007-221429-eshoponweb: mongodb's index state after the searches reads 2 segment(s).
  • mongodb exactP50Ms segment-layout-differs Run 20261007-233551-eshoponweb: mongodb's index state after the searches reads 4 segment(s).
  • elasticsearch exactP50Ms index-not-ready Run 20261006-130619-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch exactP50Ms index-not-ready Run 20261006-130619-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch exactP50Ms index-not-ready Run 20261006-142724-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch exactP50Ms index-not-ready Run 20261006-142724-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch exactP50Ms index-not-ready Run 20261006-154837-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch exactP50Ms index-not-ready Run 20261006-154837-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch exactP50Ms index-not-ready Run 20261007-205106-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch exactP50Ms index-not-ready Run 20261007-205106-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch exactP50Ms index-not-ready Run 20261007-221429-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch exactP50Ms index-not-ready Run 20261007-221429-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.
  • elasticsearch exactP50Ms index-not-ready Run 20261007-233551-eshoponweb: elasticsearch's index state after the load read not ready, 0 of 524 vectors indexed.
  • elasticsearch exactP50Ms index-not-ready Run 20261007-233551-eshoponweb: elasticsearch's index state after the searches read not ready, 0 of 524 vectors indexed.

Recall in hits

Enginev7 hits per runv8 hits per runDiffers between runs
clickhouse199, 193, 198 of 200199, 199, 199 of 200yes
vespa200, 200, 200 of 200200, 200, 200 of 200no
oracle200, 200, 200 of 200200, 200, 200 of 200no
elasticsearch200, 200, 200 of 200200, 200, 200 of 200no
sql200, 200, 200 of 200200, 200, 200 of 200no
pgvector200, 200, 200 of 200200, 200, 200 of 200no
sqlitevec200, 200, 200 of 200200, 200, 200 of 200no
qdrant200, 200, 200 of 200200, 200, 200 of 200no
opensearch200, 200, 200 of 200200, 200, 200 of 200no
qdrant-hnsw200, 200, 200 of 200200, 200, 200 of 200no
redis200, 200, 200 of 200200, 200, 200 of 200no
milvus200, 200, 200 of 200200, 200, 200 of 200no
mariadb200, 200, 200 of 200200, 200, 200 of 200no
weaviate200, 200, 200 of 200200, 200, 200 of 200no
mongodb200, 200, 200 of 200200, 200, 200 of 200no
chroma200, 200, 200 of 200200, 200, 200 of 200no
typesense200, 200, 200 of 200200, 200, 200 of 200no
sql-diskann193, 193, 193 of 200193, 193, 193 of 200no
duckdb200, 200, 200 of 200200, 200, 200 of 200no

Recall counts hits of the exact top 10 over 20 queries, 200 per run; it is printed, never ranked.

sources
  • results results:top = 10
  • results results:queryCount = 20
  • consolidated consolidated:recall[0].of = 200

The recall hits of v7 are the recall of each run times 20 queries times 10 hits, rounded; those runs record no hit count.

sources
  • consolidated consolidated:recallDerivedSessions[0] = v7
  • results results:queryCount = 20
  • results results:top = 10

clickhouse's recall hits differ between runs: v7 199, 193, 198; v8 199, 199, 199.

sources
  • consolidated consolidated:recall[target=clickhouse].hits.v7[0] = 199
  • consolidated consolidated:recall[target=clickhouse].hits.v7[1] = 193
  • consolidated consolidated:recall[target=clickhouse].hits.v7[2] = 198
  • consolidated consolidated:recall[target=clickhouse].hits.v8[0] = 199
  • consolidated consolidated:recall[target=clickhouse].hits.v8[1] = 199
  • consolidated consolidated:recall[target=clickhouse].hits.v8[2] = 199

Facts and costs side by side

CPU per search is cost summed over every thread.

no sources recorded

It can exceed the time per search, so it is not a split of the latency.

no sources recorded

This test did not isolate causes.

no sources recorded

Costs are medians over the 3 runs of v8, and a cost is left blank unless every one of them recorded it.

sources
  • consolidated consolidated:runsPerSession = 3

At one searcher, client CPU per search ran from 0.303 ms (mongodb) to 4.985 ms (duckdb).

sources
  • consolidated consolidated:why[target=mongodb].costs.clientCpuMsPerSearch.1 = 0.303
  • consolidated consolidated:why[target=duckdb].costs.clientCpuMsPerSearch.1 = 4.985

At one searcher, engine CPU per search ran from 0.258 ms (redis) to 8.246 ms (weaviate) where measured.

sources
  • consolidated consolidated:why[target=redis].costs.engineCpuMsPerSearch.1 = 0.258
  • consolidated consolidated:why[target=weaviate].costs.engineCpuMsPerSearch.1 = 8.246

Hosting embedded is recorded for sqlitevec and duckdb: each runs inside the test's own process, so its client CPU per search includes the engine's own work.

sources
  • results results:targets[sqlitevec].hosting#embedded = embedded
  • results results:targets[duckdb].hosting#embedded = embedded

sql-diskann recorded no setting for how hard a query searches.

sources
  • results results@20261007-205106-eshoponweb:targets[sql-diskann].searchSettings#L=48 = L=48
EngineFactsSearch effort per queryEngine CPU per search, one searcher (ms)Engine CPU per search, eight searchers (ms)Client CPU per search, one searcher (ms)Client CPU per search, eight searchers (ms)Engine CPUs busy, eight searchers
redis
  • index HNSW TYPE FLOAT32 M=16 EF_CONSTRUCTION=128, EF_RUNTIME=100 (recorded, documented; results:targets[redis].index#HNSW TYPE FLOAT32 M=16 EF_CONSTRUCTION=128, EF_RUNTIME=100 per query; in all 6 run(s) selected, at targets[redis].index)
  • search (approximate) HNSW, EF_RUNTIME=100 per query (recorded, documented; results:targets[redis].index#HNSW TYPE FLOAT32 M=16 EF_CONSTRUCTION=128, EF_RUNTIME=100 per query; in all 6 run(s) selected, at targets[redis].index)
  • storage Redis is an in-memory but persistent on disk database (documented; doc:design/engine-docs/redis-faq-2026-10-07.html#Redis is an in-memory but persistent on disk database; design/engine-docs/redis-faq-2026-10-07.html, inside one text node)
  • protocol StackExchange.Redis (set-by-code; src/GenericVectorBuilder.Engines/Sinks/RedisSink.cs#using StackExchange.Redis;; src/GenericVectorBuilder.Engines/Sinks/RedisSink.cs:12)
  • set-by-setup save "300 1" (set-by-code; deploy/engines/redis.compose.yaml#--save "300 1"; deploy/engines/redis.compose.yaml:18)
  • set-by-setup appendonly no (set-by-code; deploy/engines/redis.compose.yaml#--appendonly no; deploy/engines/redis.compose.yaml:18)
  • set-by-setup mem_limit: 12g (set-by-code; deploy/engines/redis.compose.yaml#mem_limit: 12g; deploy/engines/redis.compose.yaml:23)
  • EF_CONSTRUCTION=128 (20261007-205106-eshoponweb)
  • EF_RUNTIME=100 (20261007-205106-eshoponweb)
  • M=16 (20261007-205106-eshoponweb)
0.260.230.550.361.21
mariadb
  • index VECTOR INDEX (HNSW variant) DISTANCE=cosine, M=16 (recorded, unverified; results:targets[mariadb].index#VECTOR INDEX (HNSW variant) DISTANCE=cosine, M=16; in all 6 run(s) selected, at targets[mariadb].index)
  • search (approximate) EXPLAIN of the search uses key vec_idx (measured; results:targets[mariadb].load.indexNote#EXPLAIN of the default search uses key vec_idx; in all 6 run(s) selected, at targets[mariadb].load.indexNote)
  • storage not recorded (checked; absent:results:targets[mariadb]#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[mariadb])
  • protocol MySqlConnector (set-by-code; src/GenericVectorBuilder.Engines/Sinks/MariaDbSink.cs#using MySqlConnector;; src/GenericVectorBuilder.Engines/Sinks/MariaDbSink.cs:10)
  • set-by-setup innodb-buffer-pool-size=2G (set-by-code; deploy/engines/mariadb-bench.compose.yaml#--innodb-buffer-pool-size=2G; deploy/engines/mariadb-bench.compose.yaml:47)
  • set-by-setup mhnsw-max-cache-size=4G (set-by-code; deploy/engines/mariadb-bench.compose.yaml#--mhnsw-max-cache-size=4G; deploy/engines/mariadb-bench.compose.yaml:48)
  • set-by-setup mem_limit: 8g (set-by-code; deploy/engines/mariadb-bench.compose.yaml#mem_limit: 8g; deploy/engines/mariadb-bench.compose.yaml:56)
  • DISTANCE=cosine (20261007-205106-eshoponweb)
  • M=16 (20261007-205106-eshoponweb)
  • mhnsw_ef_search=100 (20261007-205106-eshoponweb)

mariadb: the clause of its recorded index text that states how hard a query searches, with how each part is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Read back in these runs from the engine or the machine:

sources
  • results results:targets[mariadb].load.indexNote#the server applied mhnsw_ef_search 100 = the server applied mhnsw_ef_search 100
mhnsw_ef_search=100 per statement
sources
  • quote results@20261007-205106-eshoponweb:targets[mariadb].index

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

(the ef 100 most engines here use, so the search effort matches;
sources
  • quote results@20261007-205106-eshoponweb:targets[mariadb].index

Backed by a saved log or measurement, not read back from the engine in these runs:

sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#SETTING mhnsw_ef_search = 20 = SETTING mhnsw_ef_search = 20
MariaDB's own default is 20;
sources
  • quote results@20261007-205106-eshoponweb:targets[mariadb].index

A clause of the mariadb text is not printed: it cites figures that no saved source backs.

sources
  • results results@20261007-205106-eshoponweb:targets[mariadb].index#recall@10 at ef 100 falls as the set grows (rand = recall@10 at ef 100 falls as the set grows (rand

In the saved re-run of the mariadb effort test, recall@10 at ef 100 on 524 random 1024-dim vectors read 0.988 to 0.996.

sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.898, ef 100 0.988, ef 3200 0.988 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.898, ef 100 0.988, ef 3200 0.988
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.882, ef 100 0.996, ef 3200 0.996 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.882, ef 100 0.996, ef 3200 0.996

In the saved re-run of the mariadb effort test, recall@10 at ef 100 on 2000 random 1024-dim vectors read 0.894 to 0.932.

sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992
0.450.620.490.383.68
pgvector
  • index HNSW vector_cosine_ops m=16 ef_construction=128 (recorded, read-back; results:targets[pgvector].index#HNSW vector_cosine_ops m=16 ef_construction=128; in all 6 run(s) selected, at targets[pgvector].index)
  • search (approximate) EXPLAIN of the search uses Index Scan (measured; results:targets[pgvector].load.indexNote#EXPLAIN of the default search uses Index Scan on it = True; in all 6 run(s) selected, at targets[pgvector].load.indexNote)
  • storage not recorded (checked; absent:results:targets[pgvector]#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[pgvector])
  • protocol Npgsql (set-by-code; src/GenericVectorBuilder.Engines/Sinks/PgVectorSink.cs#using Npgsql;; src/GenericVectorBuilder.Engines/Sinks/PgVectorSink.cs:9)
  • set-by-setup shared_buffers=2GB (set-by-code; deploy/engines/pgvector.compose.yaml#shared_buffers=2GB; deploy/engines/pgvector.compose.yaml:23)
  • set-by-setup SET LOCAL enable_seqscan = off; SET LOCAL jit = off (set-by-code; src/GenericVectorBuilder.Engines/Sinks/PgVectorSink.cs#SET LOCAL enable_seqscan = off; SET LOCAL jit = off; src/GenericVectorBuilder.Engines/Sinks/PgVectorSink.cs:84)
  • set-by-setup mem_limit: 8g (set-by-code; deploy/engines/pgvector.compose.yaml#mem_limit: 8g; deploy/engines/pgvector.compose.yaml:33)
  • ef_construction=128 (20261007-205106-eshoponweb)
  • hnsw.ef_search=100 (20261007-205106-eshoponweb)
  • m=16 (20261007-205106-eshoponweb)
0.720.970.680.543.91
qdrant
  • index exact scan, sink sends exact=true on every search (recorded, documented; results:targets[qdrant].index#exact scan: the builder's sink sends exact=true on every search; in all 6 run(s) selected, at targets[qdrant].index)
  • search (exact) no index used, exact scan by design (measured; results:targets[qdrant].indexState.afterLoad.detail#no index used, exact scan by design; in all 6 run(s) selected, at targets[qdrant].indexState.afterLoad.detail)
  • storage not recorded (checked; absent:results:targets[qdrant]#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[qdrant])
  • protocol Qdrant.Client.Grpc (set-by-code; src/GenericVectorBuilder.Core/Sinks/QdrantSink.cs#using Qdrant.Client.Grpc;; src/GenericVectorBuilder.Core/Sinks/QdrantSink.cs:3)
  • set-by-setup mem_limit: 8g (set-by-code; deploy/engines/qdrant.compose.yaml#mem_limit: 8g; deploy/engines/qdrant.compose.yaml:35)
  • exact=true (20261007-205106-eshoponweb)
0.791.000.740.543.30
qdrant-hnsw
  • index HNSW m=16 ef_construct=100 (recorded, documented; results:targets[qdrant-hnsw].index#HNSW m=16 ef_construct=100; in all 6 run(s) selected, at targets[qdrant-hnsw].index)
  • search (approximate) segment searches walked the graph and none scanned (measured; results:targets[qdrant-hnsw].indexState.afterSearch.detail#segment searches walked the graph and none scanned; in all 6 run(s) selected, at targets[qdrant-hnsw].indexState.afterSearch.detail)
  • storage not recorded (checked; absent:results:targets[qdrant-hnsw]#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[qdrant-hnsw])
  • protocol Qdrant.Client.Grpc (set-by-code; src/GenericVectorBuilder.Bench/Targets/QdrantHnswSink.cs#using Qdrant.Client.Grpc;; src/GenericVectorBuilder.Bench/Targets/QdrantHnswSink.cs:5)
  • set-by-setup mem_limit: 8g (set-by-code; deploy/engines/qdrant.compose.yaml#mem_limit: 8g; deploy/engines/qdrant.compose.yaml:35)
  • ef_construct=100 (20261007-205106-eshoponweb)
  • hnsw_ef=server (20261007-205106-eshoponweb)
  • m=16 (20261007-205106-eshoponweb)

qdrant-hnsw: the clause of its recorded index text that states how hard a query searches, with how each part is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file src/GenericVectorBuilder.Bench/Targets/QdrantHnswSink.cs#search.HnswEf = _ef.Value; = search.HnswEf = _ef.Value;
hnsw_ef=server default
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant-hnsw].index
0.730.930.730.523.24
oracle
  • index HNSW in-memory neighbor graph NEIGHBORS=16 EFCONSTRUCTION=128 (recorded, documented; results:targets[oracle].index#HNSW in-memory neighbor graph NEIGHBORS=16 EFCONSTRUCTION=128; in all 6 run(s) selected, at targets[oracle].index)
  • search (approximate) plan of the search: VECTOR INDEX HNSW SCAN (measured; results:targets[oracle].load.indexNote#plan of the default search: VECTOR INDEX HNSW SCAN; in all 6 run(s) selected, at targets[oracle].load.indexNote)
  • storage HNSW in-memory neighbor graph (recorded, documented; results:targets[oracle].index#HNSW in-memory neighbor graph; in all 6 run(s) selected, at targets[oracle].index)
  • protocol Oracle.ManagedDataAccess.Client (set-by-code; src/GenericVectorBuilder.Engines/Sinks/OracleSink.cs#using Oracle.ManagedDataAccess.Client;; src/GenericVectorBuilder.Engines/Sinks/OracleSink.cs:8)
  • cap Oracle Free caps itself at 2 CPUs (recorded, read-back; results:targets[oracle].index#Oracle Free caps itself at 2 CPUs; in all 6 run(s) selected, at targets[oracle].index)
  • set-by-setup POOL_SIZE=768M (set-by-code; deploy/engines/oracle-init/01-vector-memory.sh#POOL_SIZE=768M; deploy/engines/oracle-init/01-vector-memory.sh:13)
  • set-by-setup mem_limit: 6g (set-by-code; deploy/engines/oracle.compose.yaml#mem_limit: 6g; deploy/engines/oracle.compose.yaml:45)
  • EFCONSTRUCTION=128 (20261007-205106-eshoponweb)
  • EFSEARCH=100 (20261007-205106-eshoponweb)
  • NEIGHBORS=16 (20261007-205106-eshoponweb)
0.580.720.890.642.03
elasticsearch
  • index total_vex_size_bytes 0, index_options hnsw m=16 ef_construction=128 (measured; results:targets[elasticsearch].load.indexNote#total_vex_size_bytes 0 (_stats dense_vector), index_options hnsw m=16 ef_construction=128; in all 6 run(s) selected, at targets[elasticsearch].load.indexNote)
  • search (exact) no HNSW graph, searches scan all 524 vectors (measured; results:targets[elasticsearch].load.indexNote#NO HNSW GRAPH, searches scan all 524 vectors; in all 6 run(s) selected, at targets[elasticsearch].load.indexNote)
  • storage not recorded (checked; absent:results:targets[elasticsearch]#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[elasticsearch])
  • protocol HttpClient (set-by-code; src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ); src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs:70)
  • set-by-setup -Xms2g -Xmx2g (set-by-code; deploy/engines/elasticsearch.compose.yaml#-Xms2g -Xmx2g; deploy/engines/elasticsearch.compose.yaml:14)
  • set-by-setup mem_limit: 6g (set-by-code; deploy/engines/elasticsearch.compose.yaml#mem_limit: 6g; deploy/engines/elasticsearch.compose.yaml:19)
  • ef_construction=128 (20261007-205106-eshoponweb)
  • k=top (20261007-205106-eshoponweb)
  • m=16 (20261007-205106-eshoponweb)
  • num_candidates=100 (20261007-205106-eshoponweb)
1.051.380.460.493.74
mongodb
  • index vectorSearch index, HNSW maxEdges=16 numEdgeCandidates=128 (recorded, documented; results:targets[mongodb].index#vectorSearch index, HNSW maxEdges=16 numEdgeCandidates=128; in all 6 run(s) selected, at targets[mongodb].index)
  • search (approximate) searched through the HNSW graph (Approximate) (recorded (engine's own report); results:targets[mongodb].load.indexNote#searched through the HNSW graph (Approximate); in all 6 run(s) selected, at targets[mongodb].load.indexNote)
  • storage not recorded (checked; absent:results:targets[mongodb]#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[mongodb])
  • protocol MongoDB.Driver (set-by-code; src/GenericVectorBuilder.Engines/Sinks/MongoDbSink.cs#using MongoDB.Driver;; src/GenericVectorBuilder.Engines/Sinks/MongoDbSink.cs:7)
  • set-by-setup mem_limit: 8g (set-by-code; deploy/engines/mongodb.compose.yaml#mem_limit: 8g; deploy/engines/mongodb.compose.yaml:21)
  • maxEdges=16 (20261007-205106-eshoponweb)
  • numCandidates=20x (20261007-205106-eshoponweb)
  • numEdgeCandidates=128 (20261007-205106-eshoponweb)

mongodb: the clause of its recorded index text that states how hard a query searches, with how each part is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file src/GenericVectorBuilder.Engines/Sinks/MongoDbSinkOptions.cs#public int NumCandidatesFactor { get; set; } = 20; = public int NumCandidatesFactor { get; set; } = 20;
  • file src/GenericVectorBuilder.Engines/Sinks/MongoDbSinkOptions.cs#public int MinNumCandidates { get; set; } = 100; = public int MinNumCandidates { get; set; } = 100;
numCandidates=20x hits (min 100)
sources
  • quote results@20261007-205106-eshoponweb:targets[mongodb].index
1.321.780.300.283.80
sqlitevec
  • index vec0 brute-force scan, no ANN index (exact) (recorded, read-back; results:targets[sqlitevec].index#vec0 brute-force scan, no ANN index (exact); in all 6 run(s) selected, at targets[sqlitevec].index)
  • search (exact) no index, exact scan by design (measured; results:targets[sqlitevec].indexState.afterLoad.detail#no index, exact scan by design; in all 6 run(s) selected, at targets[sqlitevec].indexState.afterLoad.detail)
  • storage not recorded (checked; absent:results:targets[sqlitevec].index+engine+durability#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[sqlitevec].index+engine+durability)
  • protocol Microsoft.Data.Sqlite (set-by-code; src/GenericVectorBuilder.Engines/Sinks/SqliteVecSink.cs#using Microsoft.Data.Sqlite;; src/GenericVectorBuilder.Engines/Sinks/SqliteVecSink.cs:9)
  • set-by-setup PRAGMA journal_mode=WAL (set-by-code; src/GenericVectorBuilder.Engines/Sinks/SqliteVecSink.cs#Run( connection, "PRAGMA journal_mode=WAL;" ); src/GenericVectorBuilder.Engines/Sinks/SqliteVecSink.cs:528)
  • set-by-setup PRAGMA synchronous=NORMAL (set-by-code; src/GenericVectorBuilder.Engines/Sinks/SqliteVecSink.cs#Run( connection, "PRAGMA synchronous=NORMAL;" ); src/GenericVectorBuilder.Engines/Sinks/SqliteVecSink.cs:529)
  • chunk_size=1024 (20261007-205106-eshoponweb)
--2.023.51-
vespa
  • index HNSW float32 tensor, prenormalized-angular, max-links-per-node=16 (recorded, documented; results:targets[vespa].index#HNSW float32 tensor, prenormalized-angular (cosine), max-links-per-node=16; in all 6 run(s) selected, at targets[vespa].index)
  • search (approximate) nearestNeighbor approximate:true (measured; results:targets[vespa].load.indexNote#nearestNeighbor approximate:true with targetHits above the count; in all 6 run(s) selected, at targets[vespa].load.indexNote)
  • storage vectors held in memory (recorded, unverified; results:targets[vespa].index#vectors held in memory; in all 6 run(s) selected, at targets[vespa].index)
  • protocol HttpClient (set-by-code; src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ); src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs:44)
  • set-by-setup mem_limit: 6g (set-by-code; deploy/engines/vespa.compose.yaml#mem_limit: 6g; deploy/engines/vespa.compose.yaml:20)
  • ef=100 (20261007-205106-eshoponweb)
  • max-links-per-node=16 (20261007-205106-eshoponweb)
  • neighbors-to-explore-at-insert=128 (20261007-205106-eshoponweb)
  • targetHits=top (20261007-205106-eshoponweb)
2.282.430.920.873.82
opensearch
  • index faiss HNSW float32, no compression, m=16, ef_construction=128, cosinesimil (recorded, documented; results:targets[opensearch].index#faiss HNSW float32, no compression, m=16, ef_construction=128, cosinesimil; in all 6 run(s) selected, at targets[opensearch].index)
  • search (approximate) every segment searched through its HNSW graph (measured; results:targets[opensearch].load.indexNote#every segment searched through its HNSW graph; in all 6 run(s) selected, at targets[opensearch].load.indexNote)
  • storage not recorded (checked; absent:results:targets[opensearch]#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[opensearch])
  • protocol HttpClient (set-by-code; src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ); src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs:70)
  • set-by-setup -Xms2g -Xmx2g (set-by-code; deploy/engines/opensearch.compose.yaml#-Xms2g -Xmx2g; deploy/engines/opensearch.compose.yaml:16)
  • set-by-setup mem_limit: 6g (set-by-code; deploy/engines/opensearch.compose.yaml#mem_limit: 6g; deploy/engines/opensearch.compose.yaml:21)
  • approximate_threshold=0 (20261007-205106-eshoponweb)
  • ef_construction=128 (20261007-205106-eshoponweb)
  • ef_search=100 (20261007-205106-eshoponweb)
  • k=top (20261007-205106-eshoponweb)
  • m=16 (20261007-205106-eshoponweb)
1.752.550.470.513.87
chroma
  • index HNSW M=16 ef_construction=128, ef_search=100 (recorded, documented; results:targets[chroma].index#HNSW M=16 ef_construction=128, ef_search=100; in all 6 run(s) selected, at targets[chroma].index)
  • search (approximate) approximate, no exact mode (recorded, unverified; results:targets[chroma].index#approximate only (no exact mode); in all 6 run(s) selected, at targets[chroma].index)
  • storage not recorded (checked; absent:results:targets[chroma]#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[chroma])
  • protocol HttpClient (set-by-code; src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl; src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs:73)
  • set-by-setup mem_limit: 6g (set-by-code; deploy/engines/chroma.compose.yaml#mem_limit: 6g; deploy/engines/chroma.compose.yaml:20)
  • M=16 (20261007-205106-eshoponweb)
  • ef_construction=128 (20261007-205106-eshoponweb)
  • ef_search=100 (20261007-205106-eshoponweb)

chroma: the clause of its recorded index text that states how hard a query searches, with how each part is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#["max_neighbors"] = _options.MaxNeighbors, = ["max_neighbors"] = _options.MaxNeighbors,
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#["ef_construction"] = _options.EfConstruction, = ["ef_construction"] = _options.EfConstruction,
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#["ef_search"] = _options.EfSearch, = ["ef_search"] = _options.EfSearch,
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSinkOptions.cs#int MaxNeighbors = 16, = int MaxNeighbors = 16,
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSinkOptions.cs#int EfConstruction = 128, = int EfConstruction = 128,
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSinkOptions.cs#int EfSearch = 100 ); = int EfSearch = 100 );
ef_search=100
sources
  • quote results@20261007-205106-eshoponweb:targets[chroma].index

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

(Chroma default)
sources
  • quote results@20261007-205106-eshoponweb:targets[chroma].index
2.462.720.470.472.15
milvus
  • index HNSW M=16 efConstruction=128, ef=100, metric COSINE (recorded, documented; results:targets[milvus].index#HNSW M=16 efConstruction=128, ef=100, metric COSINE; in all 6 run(s) selected, at targets[milvus].index)
  • search (approximate) approximate, no exact mode (recorded, unverified; results:targets[milvus].index#approximate only (no exact mode); in all 6 run(s) selected, at targets[milvus].index)
  • storage not recorded (checked; absent:results:targets[milvus]#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[milvus])
  • protocol HttpClient (set-by-code; src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl; src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs:108)
  • set-by-setup mem_limit: 8g (set-by-code; deploy/engines/milvus.compose.yaml#mem_limit: 8g; deploy/engines/milvus.compose.yaml:68)
  • M=16 (20261007-205106-eshoponweb)
  • ef=100 (20261007-205106-eshoponweb)
  • efConstruction=128 (20261007-205106-eshoponweb)
2.742.950.550.633.74
sql-diskann
  • index DiskANN (preview) via VECTOR_SEARCH, cosine (recorded, unverified; results:targets[sql-diskann].index#DiskANN (preview) via VECTOR_SEARCH, cosine; in all 6 run(s) selected, at targets[sql-diskann].index)
  • search (approximate) DiskANN index built and used (measured; results:targets[sql-diskann].indexState.afterLoad.detail#DiskANN index built and used; in all 6 run(s) selected, at targets[sql-diskann].indexState.afterLoad.detail)
  • storage not recorded (checked; absent:results:targets[sql-diskann]#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[sql-diskann])
  • protocol Microsoft.Data.SqlClient (set-by-code; src/GenericVectorBuilder.Bench/Targets/SqlDiskAnnSink.cs#using Microsoft.Data.SqlClient;; src/GenericVectorBuilder.Bench/Targets/SqlDiskAnnSink.cs:5)
  • protocol vector as NVarChar value from ToJson (set-by-code; src/GenericVectorBuilder.Bench/Targets/SqlDiskAnnSink.cs#SqlDbType.NVarChar, -1 ).Value = SqlVectorSink.ToJson( vector ); src/GenericVectorBuilder.Bench/Targets/SqlDiskAnnSink.cs:305)
  • set-by-setup MSSQL_MEMORY_LIMIT_MB: "6144" (set-by-code; deploy/engines/mssql.compose.yaml#MSSQL_MEMORY_LIMIT_MB: "6144"; deploy/engines/mssql.compose.yaml:49)
  • set-by-setup mem_limit: 8g (set-by-code; deploy/engines/mssql.compose.yaml#mem_limit: 8g; deploy/engines/mssql.compose.yaml:56)
  • L=48 (20261007-205106-eshoponweb)
  • M=8 (20261007-205106-eshoponweb)
  • R=48 (20261007-205106-eshoponweb)
  • StartId=306 (20261007-205106-eshoponweb)
3.485.631.011.083.91
duckdb
  • index HNSW (vss extension) FLOAT[n] metric=cosine m=16 ef_construction=128 (recorded, documented; results:targets[duckdb].index#HNSW (vss extension) FLOAT[n] metric=cosine m=16 ef_construction=128; in all 6 run(s) selected, at targets[duckdb].index)
  • search (approximate) EXPLAIN of the search shows HNSW_INDEX_SCAN (measured; results:targets[duckdb].load.indexNote#EXPLAIN of the default search shows HNSW_INDEX_SCAN; in all 6 run(s) selected, at targets[duckdb].load.indexNote)
  • storage not recorded (checked; absent:results:targets[duckdb].index+engine+durability#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[duckdb].index+engine+durability)
  • protocol DuckDB.NET.Data (set-by-code; src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs#using DuckDB.NET.Data;; src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs:7)
  • set-by-setup SET hnsw_enable_experimental_persistence = true (set-by-code; src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs#Run( connection, "SET hnsw_enable_experimental_persistence = true;" ); src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs:750)
  • set-by-setup CheckpointThreshold 256MB (set-by-code; src/GenericVectorBuilder.Engines/Sinks/DuckDbSinkOptions.cs#public string CheckpointThreshold { get; set; } = "256MB";; src/GenericVectorBuilder.Engines/Sinks/DuckDbSinkOptions.cs:49)
  • set-by-setup MemoryLimit 8GB (set-by-code; src/GenericVectorBuilder.Engines/Sinks/DuckDbSinkOptions.cs#public string MemoryLimit { get; set; } = "8GB";; src/GenericVectorBuilder.Engines/Sinks/DuckDbSinkOptions.cs:38)
  • checkpoint_threshold=256MB (20261007-205106-eshoponweb)
  • ef_construction=128 (20261007-205106-eshoponweb)
  • ef_search=100 (20261007-205106-eshoponweb)
  • hnsw_enable_experimental_persistence=true (20261007-205106-eshoponweb)
  • m=16 (20261007-205106-eshoponweb)
  • metric=cosine (20261007-205106-eshoponweb)
--4.986.83-
sql
  • index exact VECTOR_DISTANCE cosine, no vector index (full scan) (recorded, documented; results:targets[sql].index#exact VECTOR_DISTANCE cosine, no vector index (full scan); in all 6 run(s) selected, at targets[sql].index)
  • search (exact) no index used, exact scan by design (measured; results:targets[sql].indexState.afterLoad.detail#no index used, exact scan by design; in all 6 run(s) selected, at targets[sql].indexState.afterLoad.detail)
  • storage not recorded (checked; absent:results:targets[sql]#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[sql])
  • protocol Microsoft.Data.SqlClient (set-by-code; src/GenericVectorBuilder.Core/Sinks/SqlVectorSink.cs#using Microsoft.Data.SqlClient;; src/GenericVectorBuilder.Core/Sinks/SqlVectorSink.cs:7)
  • protocol vector as NVarChar value from ToJson (set-by-code; src/GenericVectorBuilder.Core/Sinks/SqlVectorSink.cs#SqlDbType.NVarChar, -1 ).Value = ToJson( vector ); src/GenericVectorBuilder.Core/Sinks/SqlVectorSink.cs:155)
  • protocol CAST( @q AS VECTOR(dimension) ) (set-by-code; src/GenericVectorBuilder.Core/Sinks/SqlVectorSink.cs#CAST( @q AS VECTOR({dimension}) ); src/GenericVectorBuilder.Core/Sinks/SqlVectorSink.cs:149)
  • set-by-setup MSSQL_MEMORY_LIMIT_MB: "6144" (set-by-code; deploy/engines/mssql.compose.yaml#MSSQL_MEMORY_LIMIT_MB: "6144"; deploy/engines/mssql.compose.yaml:49)
  • set-by-setup mem_limit: 8g (set-by-code; deploy/engines/mssql.compose.yaml#mem_limit: 8g; deploy/engines/mssql.compose.yaml:56)
  • description=exact VECTOR_DISTANCE cosine, no vector index (full scan) (20261007-205106-eshoponweb)
3.885.931.211.193.50
typesense
  • index HNSW float32 (hnswlib), m=16, ef_construction=128 (recorded, documented; results:targets[typesense].index#HNSW float32 (hnswlib), m=16, ef_construction=128; in all 6 run(s) selected, at targets[typesense].index)
  • search (approximate) HNSW graph returns 524 of 524 vectors (measured; results:targets[typesense].load.indexNote#HNSW graph returns 524 of 524 vectors; in all 6 run(s) selected, at targets[typesense].load.indexNote)
  • storage index held in memory (recorded, unverified; results:targets[typesense].index#index held in memory; in all 6 run(s) selected, at targets[typesense].index)
  • protocol HttpClient (set-by-code; src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ); src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs:69)
  • protocol vector as string vectorQuery (set-by-code; src/GenericVectorBuilder.Engines/Sinks/TypesenseSink.cs#string vectorQuery = $"vec:([{string.Join( ",", vector.Select(; src/GenericVectorBuilder.Engines/Sinks/TypesenseSink.cs:249)
  • set-by-setup mem_limit: 6g (set-by-code; deploy/engines/typesense.compose.yaml#mem_limit: 6g; deploy/engines/typesense.compose.yaml:24)
  • ef=100 (20261007-205106-eshoponweb)
  • ef_construction=128 (20261007-205106-eshoponweb)
  • k=top (20261007-205106-eshoponweb)
  • m=16 (20261007-205106-eshoponweb)
3.876.700.520.583.86
clickhouse
  • index vector_similarity HNSW cosineDistance, quantization bf16, M=16 (recorded, documented; results:targets[clickhouse].index#vector_similarity HNSW cosineDistance, quantization bf16, M=16; in all 6 run(s) selected, at targets[clickhouse].index)
  • search (approximate) plan of the search uses the Skip index vec_idx (measured; results:targets[clickhouse].load.indexNote#plan of the default search uses the Skip index vec_idx; in all 6 run(s) selected, at targets[clickhouse].load.indexNote)
  • storage not recorded (checked; absent:results:targets[clickhouse]#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[clickhouse])
  • protocol HttpClient over http (set-by-code; src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"; src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs:117)
  • set-by-setup mem_limit: 8g (set-by-code; deploy/engines/clickhouse.compose.yaml#mem_limit: 8g; deploy/engines/clickhouse.compose.yaml:36)
  • M=16 (20261007-205106-eshoponweb)
  • ef_construction=128 (20261007-205106-eshoponweb)
  • hnsw_candidate_list_size_for_search=256 (20261007-205106-eshoponweb)
7.1711.370.861.053.97
weaviate
  • index HNSW maxConnections(M)=16 efConstruction=128 (recorded, documented; results:targets[weaviate].index#HNSW maxConnections(M)=16 efConstruction=128; in all 6 run(s) selected, at targets[weaviate].index)
  • search (approximate) approximate, no exact mode (recorded, unverified; results:targets[weaviate].index#approximate only (no exact mode); in all 6 run(s) selected, at targets[weaviate].index)
  • storage not recorded (checked; absent:results:targets[weaviate]#in memory|in-memory|memory pool|RAM; none of 4 words in 6 run(s) at targets[weaviate])
  • protocol HttpClient (set-by-code; src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl; src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs:86)
  • protocol HttpMethod Post, v1 graphql (set-by-code; src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#HttpMethod.Post, "v1/graphql"; src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs:542)
  • set-by-setup GOMEMLIMIT: 6GiB (set-by-code; deploy/engines/weaviate.compose.yaml#GOMEMLIMIT: 6GiB; deploy/engines/weaviate.compose.yaml:23)
  • set-by-setup mem_limit: 8g (set-by-code; deploy/engines/weaviate.compose.yaml#mem_limit: 8g; deploy/engines/weaviate.compose.yaml:29)
  • ef=-1 (20261007-205106-eshoponweb)
  • efConstruction=128 (20261007-205106-eshoponweb)

weaviate: the clause of its recorded index text that states how hard a query searches, with how each part is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Documented on a saved page, not read back from the engine:

sources
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#["ef"] = _options.Ef, = ["ef"] = _options.Ef,
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSinkOptions.cs#int Ef = -1 ); = int Ef = -1 );
  • file design/engine-docs/weaviate-vector-index-reference-2026-10-07.mdx#`ef` = `ef`
  • file design/engine-docs/weaviate-vector-index-reference-2026-10-07.mdx#`dynamicEfFactor` = `dynamicEfFactor`
  • file design/engine-docs/weaviate-vector-index-reference-2026-10-07.mdx#`dynamicEfMin` = `dynamicEfMin`
  • file design/engine-docs/weaviate-vector-index-reference-2026-10-07.mdx#`dynamicEfMax` = `dynamicEfMax`
  • file design/engine-docs/weaviate-vector-index-concepts-2026-10-07.md#The dynamic list size will be set as the query limit multiplied by `dynamicEfFactor`, modified by a minimum of `dynamicEfMin` and a maximum of `dynamicEfMax`. = The dynamic list size will be set as the query limit multiplied by `dynamicEfFactor`, modified by a minimum of `dynamicEfMin` and a maximum of `dynamicEfMax`.
ef=-1
sources
  • quote results@20261007-205106-eshoponweb:targets[weaviate].index
(dynamic: limit x 8 clamped 100..500)
sources
  • quote results@20261007-205106-eshoponweb:targets[weaviate].index
8.2512.960.560.613.97
Statements behind the search effort column

redis recorded these search and index settings: EF_CONSTRUCTION=128, EF_RUNTIME=100, M=16.

sources
  • results results@20261007-205106-eshoponweb:targets[redis].searchSettings#EF_CONSTRUCTION=128 = EF_CONSTRUCTION=128
  • results results@20261007-205106-eshoponweb:targets[redis].searchSettings#EF_RUNTIME=100 = EF_RUNTIME=100
  • results results@20261007-205106-eshoponweb:targets[redis].searchSettings#M=16 = M=16

mariadb recorded these search and index settings: DISTANCE=cosine, M=16, mhnsw_ef_search=100.

sources
  • results results@20261007-205106-eshoponweb:targets[mariadb].searchSettings#DISTANCE=cosine = DISTANCE=cosine
  • results results@20261007-205106-eshoponweb:targets[mariadb].searchSettings#M=16 = M=16
  • results results@20261007-205106-eshoponweb:targets[mariadb].searchSettings#mhnsw_ef_search=100 = mhnsw_ef_search=100

pgvector recorded these search and index settings: ef_construction=128, hnsw.ef_search=100, m=16.

sources
  • results results@20261007-205106-eshoponweb:targets[pgvector].searchSettings#ef_construction=128 = ef_construction=128
  • results results@20261007-205106-eshoponweb:targets[pgvector].searchSettings#hnsw.ef_search=100 = hnsw.ef_search=100
  • results results@20261007-205106-eshoponweb:targets[pgvector].searchSettings#m=16 = m=16

qdrant recorded these search and index settings: exact=true.

sources
  • results results@20261007-205106-eshoponweb:targets[qdrant].searchSettings#exact=true = exact=true

qdrant-hnsw recorded these search and index settings: ef_construct=100, hnsw_ef=server, m=16.

sources
  • results results@20261007-205106-eshoponweb:targets[qdrant-hnsw].searchSettings#ef_construct=100 = ef_construct=100
  • results results@20261007-205106-eshoponweb:targets[qdrant-hnsw].searchSettings#hnsw_ef=server = hnsw_ef=server
  • results results@20261007-205106-eshoponweb:targets[qdrant-hnsw].searchSettings#m=16 = m=16

oracle recorded these search and index settings: EFCONSTRUCTION=128, EFSEARCH=100, NEIGHBORS=16.

sources
  • results results@20261007-205106-eshoponweb:targets[oracle].searchSettings#EFCONSTRUCTION=128 = EFCONSTRUCTION=128
  • results results@20261007-205106-eshoponweb:targets[oracle].searchSettings#EFSEARCH=100 = EFSEARCH=100
  • results results@20261007-205106-eshoponweb:targets[oracle].searchSettings#NEIGHBORS=16 = NEIGHBORS=16

elasticsearch recorded these search and index settings: ef_construction=128, k=top, m=16, num_candidates=100.

sources
  • results results@20261007-205106-eshoponweb:targets[elasticsearch].searchSettings#ef_construction=128 = ef_construction=128
  • results results@20261007-205106-eshoponweb:targets[elasticsearch].searchSettings#k=top = k=top
  • results results@20261007-205106-eshoponweb:targets[elasticsearch].searchSettings#m=16 = m=16
  • results results@20261007-205106-eshoponweb:targets[elasticsearch].searchSettings#num_candidates=100 = num_candidates=100

mongodb recorded these search and index settings: maxEdges=16, numCandidates=20x, numEdgeCandidates=128.

sources
  • results results@20261007-205106-eshoponweb:targets[mongodb].searchSettings#maxEdges=16 = maxEdges=16
  • results results@20261007-205106-eshoponweb:targets[mongodb].searchSettings#numCandidates=20x = numCandidates=20x
  • results results@20261007-205106-eshoponweb:targets[mongodb].searchSettings#numEdgeCandidates=128 = numEdgeCandidates=128

sqlitevec recorded these search and index settings: chunk_size=1024.

sources
  • results results@20261007-205106-eshoponweb:targets[sqlitevec].searchSettings#chunk_size=1024 = chunk_size=1024

vespa recorded these search and index settings: ef=100, max-links-per-node=16, neighbors-to-explore-at-insert=128, targetHits=top.

sources
  • results results@20261007-205106-eshoponweb:targets[vespa].searchSettings#ef=100 = ef=100
  • results results@20261007-205106-eshoponweb:targets[vespa].searchSettings#max-links-per-node=16 = max-links-per-node=16
  • results results@20261007-205106-eshoponweb:targets[vespa].searchSettings#neighbors-to-explore-at-insert=128 = neighbors-to-explore-at-insert=128
  • results results@20261007-205106-eshoponweb:targets[vespa].searchSettings#targetHits=top = targetHits=top

opensearch recorded these search and index settings: approximate_threshold=0, ef_construction=128, ef_search=100, k=top, m=16.

sources
  • results results@20261007-205106-eshoponweb:targets[opensearch].searchSettings#approximate_threshold=0 = approximate_threshold=0
  • results results@20261007-205106-eshoponweb:targets[opensearch].searchSettings#ef_construction=128 = ef_construction=128
  • results results@20261007-205106-eshoponweb:targets[opensearch].searchSettings#ef_search=100 = ef_search=100
  • results results@20261007-205106-eshoponweb:targets[opensearch].searchSettings#k=top = k=top
  • results results@20261007-205106-eshoponweb:targets[opensearch].searchSettings#m=16 = m=16

chroma recorded these search and index settings: M=16, ef_construction=128, ef_search=100.

sources
  • results results@20261007-205106-eshoponweb:targets[chroma].searchSettings#M=16 = M=16
  • results results@20261007-205106-eshoponweb:targets[chroma].searchSettings#ef_construction=128 = ef_construction=128
  • results results@20261007-205106-eshoponweb:targets[chroma].searchSettings#ef_search=100 = ef_search=100

milvus recorded these search and index settings: M=16, ef=100, efConstruction=128.

sources
  • results results@20261007-205106-eshoponweb:targets[milvus].searchSettings#M=16 = M=16
  • results results@20261007-205106-eshoponweb:targets[milvus].searchSettings#ef=100 = ef=100
  • results results@20261007-205106-eshoponweb:targets[milvus].searchSettings#efConstruction=128 = efConstruction=128

sql-diskann recorded these search and index settings: L=48, M=8, R=48, StartId=306.

sources
  • results results@20261007-205106-eshoponweb:targets[sql-diskann].searchSettings#L=48 = L=48
  • results results@20261007-205106-eshoponweb:targets[sql-diskann].searchSettings#M=8 = M=8
  • results results@20261007-205106-eshoponweb:targets[sql-diskann].searchSettings#R=48 = R=48
  • results results@20261007-205106-eshoponweb:targets[sql-diskann].searchSettings#StartId=306 = StartId=306

duckdb recorded these search and index settings: checkpoint_threshold=256MB, ef_construction=128, ef_search=100, hnsw_enable_experimental_persistence=true, m=16, metric=cosine.

sources
  • results results@20261007-205106-eshoponweb:targets[duckdb].searchSettings#checkpoint_threshold=256MB = checkpoint_threshold=256MB
  • results results@20261007-205106-eshoponweb:targets[duckdb].searchSettings#ef_construction=128 = ef_construction=128
  • results results@20261007-205106-eshoponweb:targets[duckdb].searchSettings#ef_search=100 = ef_search=100
  • results results@20261007-205106-eshoponweb:targets[duckdb].searchSettings#hnsw_enable_experimental_persistence=true = hnsw_enable_experimental_persistence=true
  • results results@20261007-205106-eshoponweb:targets[duckdb].searchSettings#m=16 = m=16
  • results results@20261007-205106-eshoponweb:targets[duckdb].searchSettings#metric=cosine = metric=cosine

sql recorded these search and index settings: description=exact VECTOR_DISTANCE cosine, no vector index (full scan).

sources
  • results results@20261007-205106-eshoponweb:targets[sql].searchSettings#description=exact VECTOR_DISTANCE cosine, no vector index (full scan) = description=exact VECTOR_DISTANCE cosine, no vector index (full scan)

typesense recorded these search and index settings: ef=100, ef_construction=128, k=top, m=16.

sources
  • results results@20261007-205106-eshoponweb:targets[typesense].searchSettings#ef=100 = ef=100
  • results results@20261007-205106-eshoponweb:targets[typesense].searchSettings#ef_construction=128 = ef_construction=128
  • results results@20261007-205106-eshoponweb:targets[typesense].searchSettings#k=top = k=top
  • results results@20261007-205106-eshoponweb:targets[typesense].searchSettings#m=16 = m=16

clickhouse recorded these search and index settings: M=16, ef_construction=128, hnsw_candidate_list_size_for_search=256.

sources
  • results results@20261007-205106-eshoponweb:targets[clickhouse].searchSettings#M=16 = M=16
  • results results@20261007-205106-eshoponweb:targets[clickhouse].searchSettings#ef_construction=128 = ef_construction=128
  • results results@20261007-205106-eshoponweb:targets[clickhouse].searchSettings#hnsw_candidate_list_size_for_search=256 = hnsw_candidate_list_size_for_search=256

weaviate recorded these search and index settings: ef=-1, efConstruction=128.

sources
  • results results@20261007-205106-eshoponweb:targets[weaviate].searchSettings#ef=-1 = ef=-1
  • results results@20261007-205106-eshoponweb:targets[weaviate].searchSettings#efConstruction=128 = efConstruction=128

Threshold and basis

Threshold 45.00%; basis points 4500; ratio 1.45

An engine is shown ahead of another when, in each session separately, its slowest run beat the other's fastest run by at least 1.45 times; every other pair is not separated by this test.

sources
  • consolidated consolidated:threshold.tBp|bp-ratio = 1.45

The threshold is 45%: the smallest multiple of 5% at least 5% above the largest move in the basis, 35.82%, and never below 35%.

sources
  • consolidated consolidated:threshold.tBp|bp-pct = 45
  • consolidated consolidated:basis.stepBp|bp-pct = 5
  • consolidated consolidated:basis.marginBp|bp-pct = 5
  • consolidated consolidated:basis.maxBp|bp-pct = 35.82
  • consolidated consolidated:basis.floorBp|bp-pct = 35

The basis holds the 12 runs of sessions v5, v6, v7 and v8, all with machine control on.

sources
  • consolidated consolidated:basis.runCount = 12

The clock was held in the runs of v7 and v8 and not in those of v5 and v6.

sources
  • consolidated consolidated:basis.clockHeld[session=v7].session = v7
  • consolidated consolidated:basis.clockHeld[session=v7].held = 3
  • consolidated consolidated:basis.clockHeld[session=v7].runs = 3
  • consolidated consolidated:basis.clockHeld[session=v8].session = v8
  • consolidated consolidated:basis.clockHeld[session=v8].held = 3
  • consolidated consolidated:basis.clockHeld[session=v8].runs = 3
  • consolidated consolidated:basis.clockHeld[session=v5].session = v5
  • consolidated consolidated:basis.clockHeld[session=v5].held = 0
  • consolidated consolidated:basis.clockHeld[session=v5].runs = 3
  • consolidated consolidated:basis.clockHeld[session=v6].session = v6
  • consolidated consolidated:basis.clockHeld[session=v6].held = 0
  • consolidated consolidated:basis.clockHeld[session=v6].runs = 3

Basis moves are taken between runs in which the engine recorded the same setup: its engine text, index text, search settings, durability text, engine files, engine settings, image id and hosting.

no sources recorded

A field other than the engine text and the index text that one of two runs did not record is not compared.

no sources recorded

The largest move was 35.82%, the QPS@8 ratio of clickhouse/oracle between runs 20261006-142724-eshoponweb (seed 702) and 20261007-205106-eshoponweb (seed 801).

sources
  • consolidated consolidated:basis.maxMove.moveBp|bp-pct = 35.82
  • consolidated consolidated:basis.maxMove.pair = clickhouse/oracle
  • consolidated consolidated:basis.maxMove.runs[0] = 20261006-142724-eshoponweb
  • consolidated consolidated:basis.maxMove.runs[1] = 20261007-205106-eshoponweb
  • consolidated consolidated:basis.maxMove.seeds[0] = 702
  • consolidated consolidated:basis.maxMove.seeds[1] = 801

Each move is rounded up to the next basis point before it is printed: the largest, 35.815% unrounded, prints as 35.82%.

sources
  • consolidated consolidated:basis.maxMove.moveBpExact|bp-pct = 35.815
  • consolidated consolidated:basis.maxMove.moveBp|bp-pct = 35.82
  • consolidated consolidated:basis.moveRule = moveBp = ceiling(10000 x hi / lo) - 10000, with hi and lo the two values (one engine) or the two same-run ratios (pair)

Those two runs differ in build.

sources
  • consolidated consolidated:basis.maxMove.differenceNames[0] = build

Run 20261007-205106-eshoponweb: the timed eight-searcher pass of clickhouse read 336 QPS, 24% from the settled 418 QPS (limit 10%), and the run recorded it as NOT HELD.

sources
  • consolidated consolidated:basis.maxMoveNotHeld[0].run = 20261007-205106-eshoponweb
  • consolidated consolidated:basis.maxMoveNotHeld[0].target = clickhouse
  • consolidated consolidated:basis.maxMoveNotHeld[0].timed = 336 QPS
  • consolidated consolidated:basis.maxMoveNotHeld[0].offPercent = 24
  • consolidated consolidated:basis.maxMoveNotHeld[0].settled = 418 QPS
  • consolidated consolidated:basis.maxMoveNotHeld[0].limitPercent = 10

The largest move includes a NOT HELD pass; with clickhouse left out of the basis, the largest move is 29.08%, the QPS@8 ratio of mongodb/oracle, and the threshold would be 35%.

sources
  • consolidated consolidated:basis.maxMoveWithout.maxBp|bp-pct = 29.08
  • consolidated consolidated:basis.maxMoveWithout.tBp|bp-pct = 35
  • consolidated consolidated:basis.maxMoveWithout.maxMove.pair = mongodb/oracle
  • consolidated consolidated:basis.maxMoveWithout.targets[0] = clickhouse

p50, between basis runs of one recorded setup: largest moves 15.28% (redis) for one engine and 26.34% (mongodb/redis) for a pair.

sources
  • consolidated consolidated:basis.perMetric.p50Ms.oneEngine.moveBp|bp-pct = 15.28
  • consolidated consolidated:basis.perMetric.p50Ms.pair.moveBp|bp-pct = 26.34

p50, between those runs that also share turbo, uncore, warm-up and rehearsal: largest moves 12.02% (mongodb) for one engine and 18.88% (mongodb/redis) for a pair.

sources
  • consolidated consolidated:basis.perMetric.p50Ms.oneEngineSameSettings.moveBp|bp-pct = 12.02
  • consolidated consolidated:basis.perMetric.p50Ms.pairSameSettings.moveBp|bp-pct = 18.88

QPS@1, between basis runs of one recorded setup: largest moves 11.49% (mongodb) for one engine and 19.33% (mongodb/pgvector) for a pair.

sources
  • consolidated consolidated:basis.perMetric.qps1.oneEngine.moveBp|bp-pct = 11.49
  • consolidated consolidated:basis.perMetric.qps1.pair.moveBp|bp-pct = 19.33

QPS@1, between those runs that also share turbo, uncore, warm-up and rehearsal: largest moves 11.49% (mongodb) for one engine and 14.01% (mongodb/sqlitevec) for a pair.

sources
  • consolidated consolidated:basis.perMetric.qps1.oneEngineSameSettings.moveBp|bp-pct = 11.49
  • consolidated consolidated:basis.perMetric.qps1.pairSameSettings.moveBp|bp-pct = 14.01

QPS@8, between basis runs of one recorded setup: largest moves 27.36% (clickhouse) for one engine and 35.82% (clickhouse/oracle) for a pair.

sources
  • consolidated consolidated:basis.perMetric.qps8.oneEngine.moveBp|bp-pct = 27.36
  • consolidated consolidated:basis.perMetric.qps8.pair.moveBp|bp-pct = 35.82

QPS@8, between those runs that also share turbo, uncore, warm-up and rehearsal: largest moves 27.36% (clickhouse) for one engine and 35.82% (clickhouse/oracle) for a pair.

sources
  • consolidated consolidated:basis.perMetric.qps8.oneEngineSameSettings.moveBp|bp-pct = 27.36
  • consolidated consolidated:basis.perMetric.qps8.pairSameSettings.moveBp|bp-pct = 35.82

exact p50, between basis runs of one recorded setup: largest moves 20.23% (redis) for one engine and 19.66% (qdrant-hnsw/redis) for a pair.

sources
  • consolidated consolidated:basis.perMetric.exactP50Ms.oneEngine.moveBp|bp-pct = 20.23
  • consolidated consolidated:basis.perMetric.exactP50Ms.pair.moveBp|bp-pct = 19.66

exact p50, between those runs that also share turbo, uncore, warm-up and rehearsal: largest moves 7.74% (opensearch) for one engine and 8.41% (opensearch/sqlitevec) for a pair.

sources
  • consolidated consolidated:basis.perMetric.exactP50Ms.oneEngineSameSettings.moveBp|bp-pct = 7.74
  • consolidated consolidated:basis.perMetric.exactP50Ms.pairSameSettings.moveBp|bp-pct = 8.41

Changes of recorded setup left out of the basis moves: 4, in clickhouse, duckdb, mariadb and sqlitevec.

sources
  • consolidated consolidated:basis.setupSplitCount = 4
  • consolidated consolidated:basis.setupSplits[0].target = clickhouse
  • consolidated consolidated:basis.setupSplits[1].target = duckdb
  • consolidated consolidated:basis.setupSplits[2].target = mariadb
  • consolidated consolidated:basis.setupSplits[3].target = sqlitevec

Each is listed with the field that changed, the move it hides and the threshold it would give.

no sources recorded

Between its v6 runs and its v7 and v8 runs, clickhouse recorded a different engine.

sources
  • consolidated consolidated:basis.setupSplits[0].target = clickhouse
  • consolidated consolidated:basis.setupSplits[0].before.sessions[0] = v6
  • consolidated consolidated:basis.setupSplits[0].after.sessions[0] = v7
  • consolidated consolidated:basis.setupSplits[0].after.sessions[1] = v8
  • consolidated consolidated:basis.setupSplits[0].fields[0] = engine

Counted across that change, the largest one-engine move is 47.36% (QPS@8) and the largest pair move 52.08% (clickhouse/redis QPS@8), and the threshold would be 60%.

sources
  • consolidated consolidated:basis.setupSplits[0].oneEngine.moveBp|bp-pct = 47.36
  • consolidated consolidated:basis.setupSplits[0].pair.moveBp|bp-pct = 52.08
  • consolidated consolidated:basis.setupSplits[0].pair.pair = clickhouse/redis
  • consolidated consolidated:basis.setupSplits[0].tBpIfCounted|bp-pct = 60

The two runs of that one-engine move also differ in turbo, uncore, warmup, build and median MHz.

sources
  • consolidated consolidated:basis.setupSplits[0].oneEngine.differenceNames[0] = turbo
  • consolidated consolidated:basis.setupSplits[0].oneEngine.differenceNames[1] = uncore
  • consolidated consolidated:basis.setupSplits[0].oneEngine.differenceNames[2] = warmup
  • consolidated consolidated:basis.setupSplits[0].oneEngine.differenceNames[3] = build
  • consolidated consolidated:basis.setupSplits[0].oneEngine.differenceNames[4] = median MHz

Between its v5 runs and its v6, v7 and v8 runs, duckdb recorded a different index.

sources
  • consolidated consolidated:basis.setupSplits[1].target = duckdb
  • consolidated consolidated:basis.setupSplits[1].before.sessions[0] = v5
  • consolidated consolidated:basis.setupSplits[1].after.sessions[0] = v6
  • consolidated consolidated:basis.setupSplits[1].after.sessions[1] = v7
  • consolidated consolidated:basis.setupSplits[1].after.sessions[2] = v8
  • consolidated consolidated:basis.setupSplits[1].fields[0] = index

Counted across that change, the largest one-engine move is 115.56% (QPS@8) and the largest pair move 144.95% (duckdb/oracle QPS@8), and the threshold would be 150%.

sources
  • consolidated consolidated:basis.setupSplits[1].oneEngine.moveBp|bp-pct = 115.56
  • consolidated consolidated:basis.setupSplits[1].pair.moveBp|bp-pct = 144.95
  • consolidated consolidated:basis.setupSplits[1].pair.pair = duckdb/oracle
  • consolidated consolidated:basis.setupSplits[1].tBpIfCounted|bp-pct = 150

The two runs of that one-engine move also differ in warmup, rehearsal, build, median MHz and whether searchSettings was recorded.

sources
  • consolidated consolidated:basis.setupSplits[1].oneEngine.differenceNames[0] = warmup
  • consolidated consolidated:basis.setupSplits[1].oneEngine.differenceNames[1] = rehearsal
  • consolidated consolidated:basis.setupSplits[1].oneEngine.differenceNames[2] = build
  • consolidated consolidated:basis.setupSplits[1].oneEngine.differenceNames[3] = median MHz
  • consolidated consolidated:basis.setupSplits[1].oneEngine.differenceNames[4] = whether searchSettings was recorded

Between its v5 runs and its v6, v7 and v8 runs, mariadb recorded a different durability.

sources
  • consolidated consolidated:basis.setupSplits[2].target = mariadb
  • consolidated consolidated:basis.setupSplits[2].before.sessions[0] = v5
  • consolidated consolidated:basis.setupSplits[2].after.sessions[0] = v6
  • consolidated consolidated:basis.setupSplits[2].after.sessions[1] = v7
  • consolidated consolidated:basis.setupSplits[2].after.sessions[2] = v8
  • consolidated consolidated:basis.setupSplits[2].fields[0] = durability

Counted across that change, the largest one-engine move is 4.09% (exact p50) and the largest pair move 17.85% (mariadb/oracle QPS@8), and the threshold would be 45%.

sources
  • consolidated consolidated:basis.setupSplits[2].oneEngine.moveBp|bp-pct = 4.09
  • consolidated consolidated:basis.setupSplits[2].pair.moveBp|bp-pct = 17.85
  • consolidated consolidated:basis.setupSplits[2].pair.pair = mariadb/oracle
  • consolidated consolidated:basis.setupSplits[2].tBpIfCounted|bp-pct = 45

The two runs of that one-engine move also differ in turbo, uncore, warmup, rehearsal, build, median MHz and whether searchSettings was recorded.

sources
  • consolidated consolidated:basis.setupSplits[2].oneEngine.differenceNames[0] = turbo
  • consolidated consolidated:basis.setupSplits[2].oneEngine.differenceNames[1] = uncore
  • consolidated consolidated:basis.setupSplits[2].oneEngine.differenceNames[2] = warmup
  • consolidated consolidated:basis.setupSplits[2].oneEngine.differenceNames[3] = rehearsal
  • consolidated consolidated:basis.setupSplits[2].oneEngine.differenceNames[4] = build
  • consolidated consolidated:basis.setupSplits[2].oneEngine.differenceNames[5] = median MHz
  • consolidated consolidated:basis.setupSplits[2].oneEngine.differenceNames[6] = whether searchSettings was recorded

Between its v5 runs and its v6, v7 and v8 runs, sqlitevec recorded a different index.

sources
  • consolidated consolidated:basis.setupSplits[3].target = sqlitevec
  • consolidated consolidated:basis.setupSplits[3].before.sessions[0] = v5
  • consolidated consolidated:basis.setupSplits[3].after.sessions[0] = v6
  • consolidated consolidated:basis.setupSplits[3].after.sessions[1] = v7
  • consolidated consolidated:basis.setupSplits[3].after.sessions[2] = v8
  • consolidated consolidated:basis.setupSplits[3].fields[0] = index

Counted across that change, the largest one-engine move is 119.36% (QPS@8) and the largest pair move 155.08% (oracle/sqlitevec QPS@8), and the threshold would be 165%.

sources
  • consolidated consolidated:basis.setupSplits[3].oneEngine.moveBp|bp-pct = 119.36
  • consolidated consolidated:basis.setupSplits[3].pair.moveBp|bp-pct = 155.08
  • consolidated consolidated:basis.setupSplits[3].pair.pair = oracle/sqlitevec
  • consolidated consolidated:basis.setupSplits[3].tBpIfCounted|bp-pct = 165

The two runs of that one-engine move also differ in warmup, rehearsal, build, median MHz and whether searchSettings was recorded.

sources
  • consolidated consolidated:basis.setupSplits[3].oneEngine.differenceNames[0] = warmup
  • consolidated consolidated:basis.setupSplits[3].oneEngine.differenceNames[1] = rehearsal
  • consolidated consolidated:basis.setupSplits[3].oneEngine.differenceNames[2] = build
  • consolidated consolidated:basis.setupSplits[3].oneEngine.differenceNames[3] = median MHz
  • consolidated consolidated:basis.setupSplits[3].oneEngine.differenceNames[4] = whether searchSettings was recorded

vespa QPS@8, seed list 502 and 503, is left out of the basis (kind: method defect); design/verdicts/v5-verdict.txt, item 2, holds the words: The @8 pass ran first in runs 502 and 503.

sources
  • consolidated consolidated:basis.exclusions[0].seeds[0] = 502
  • consolidated consolidated:basis.exclusions[0].seeds[1] = 503
  • consolidated consolidated:basis.exclusions[0].item = 2
  • file design/verdicts/v5-verdict.txt#The @8 pass ran first in runs 502 and 503 = The @8 pass ran first in runs 502 and 503
  • consolidated consolidated:basis.exclusions[0].source = design/verdicts/v5-verdict.txt

elasticsearch QPS@8, seed list 503, is left out of the basis (kind: method defect); design/verdicts/v5-verdict.txt, item 2, holds the words: run 503, the one run where @8 was its first pass.

sources
  • consolidated consolidated:basis.exclusions[1].seeds[0] = 503
  • consolidated consolidated:basis.exclusions[1].item = 2
  • file design/verdicts/v5-verdict.txt#run 503, the one run where @8 was its first pass = run 503, the one run where @8 was its first pass
  • consolidated consolidated:basis.exclusions[1].source = design/verdicts/v5-verdict.txt

clickhouse every metric, seed list 501, 502 and 503, is left out of the basis (kind: unrecorded config change); design/verdicts/v6-verdict.md, item 1, holds the words: after the v5 runs ended at 04:38.

sources
  • consolidated consolidated:basis.exclusions[2].seeds[0] = 501
  • consolidated consolidated:basis.exclusions[2].seeds[1] = 502
  • consolidated consolidated:basis.exclusions[2].seeds[2] = 503
  • consolidated consolidated:basis.exclusions[2].item = 1
  • file design/verdicts/v6-verdict.md#after the v5 runs ended at 04:38 = after the v5 runs ended at 04:38
  • consolidated consolidated:basis.exclusions[2].source = design/verdicts/v6-verdict.md

With the method defect rows kept in, the largest moves would be 74.42% for one engine and 95.64% for a pair, and the threshold 105%.

sources
  • consolidated consolidated:basis.exclusionsKept[kind=method defect].oneEngine.moveBp|bp-pct = 74.42
  • consolidated consolidated:basis.exclusionsKept[kind=method defect].pair.moveBp|bp-pct = 95.64
  • consolidated consolidated:basis.exclusionsKept[kind=method defect].tBpIfKept|bp-pct = 105

With the unrecorded config change rows kept in, the largest moves would be 27.36% for one engine and 35.82% for a pair, and the threshold 45%.

sources
  • consolidated consolidated:basis.exclusionsKept[kind=unrecorded config change].oneEngine.moveBp|bp-pct = 27.36
  • consolidated consolidated:basis.exclusionsKept[kind=unrecorded config change].pair.moveBp|bp-pct = 35.82
  • consolidated consolidated:basis.exclusionsKept[kind=unrecorded config change].tBpIfKept|bp-pct = 45

In the 6 runs without machine control, one engine moved up to 112.82% and a pair up to 148.82%; the threshold rests on runs with machine control on.

sources
  • consolidated consolidated:basis.noMachineControlCount = 6
  • consolidated consolidated:basis.noMachineControl.oneEngine.moveBp|bp-pct = 112.82
  • consolidated consolidated:basis.noMachineControl.pair.moveBp|bp-pct = 148.82

6 other runs of this pipeline are not in the basis; each is listed with its reason.

sources
  • consolidated consolidated:basis.leftOutCount = 6

Changes of recorded setup the threshold basis does not compare across

EngineWhat changedRuns before the changeRuns after the changeLargest one-engine move across the changeLargest pair move across the changeThreshold if counted
clickhouse
  • engine
    Before: ClickHouse 26.3.39.7 (MergeTree + vector_similarity index)
    After: ClickHouse 26.3.39.7 (MergeTree + vector_similarity index; image-default system logging, each log table with a TTL of 1 hour)
v6, 3 runs
runs20261005-073329-eshoponweb, 20261005-085448-eshoponweb, 20261005-101815-eshoponweb
v7, v8, 6 runs
runs20261006-130619-eshoponweb, 20261006-142724-eshoponweb, 20261006-154837-eshoponweb, 20261007-205106-eshoponweb, 20261007-221429-eshoponweb, 20261007-233551-eshoponweb
Searches per second, eight searchers at once: 47.36%, clickhouse
runs 20261005-073329-eshoponweb, 20261007-205106-eshoponweb; values 495.78, 336.453
differences between the two runs
  • turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1)
  • uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e)
  • warmup: settle check vs settle check with level test
  • build: ~/gvb-work/lanes/v6-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)
  • clickhouse pass median MHz engine/client: (3542, 3552) vs (3492, 3492)
Searches per second, eight searchers at once: 52.08%, clickhouse/redis
runs 20261005-073329-eshoponweb, 20261007-205106-eshoponweb; values 0.098, 0.064
differences between the two runs
  • turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1)
  • uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e)
  • warmup: settle check vs settle check with level test
  • build: ~/gvb-work/lanes/v6-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)
  • clickhouse pass median MHz engine/client: (3542, 3552) vs (3492, 3492)
60.00%
duckdb
  • index
    Before: HNSW (vss extension) FLOAT[n] metric=cosine m=16 ef_construction=128, ef_search=100 per connection, persistent (hnsw_enable_experimental_persistence=true, checkpoint_threshold=256MB); exact mode = array_cosine_similarity sequential scan; score = 1 - cosine distance
    After: HNSW (vss extension) FLOAT[n] metric=cosine m=16 ef_construction=128, ef_search=100 per connection, persistent (hnsw_enable_experimental_persistence=true, checkpoint_threshold=256MB); exact mode = array_cosine_similarity sequential scan; score = 1 - cosine distance; searches run concurrently, one connection per searcher (opened as searchers arrive, at most 32), writes run one at a time and never overlap a search
v5, 3 runs
runs20261005-023459-eshoponweb, 20261005-031556-eshoponweb, 20261005-035711-eshoponweb
v6, v7, v8, 9 runs
runs20261005-073329-eshoponweb, 20261005-085448-eshoponweb, 20261005-101815-eshoponweb, 20261006-130619-eshoponweb, 20261006-142724-eshoponweb, 20261006-154837-eshoponweb, 20261007-205106-eshoponweb, 20261007-221429-eshoponweb, 20261007-233551-eshoponweb
Searches per second, eight searchers at once: 115.56%, duckdb
runs 20261005-035711-eshoponweb, 20261005-101815-eshoponweb; values 279.212, 601.868
differences between the two runs
  • warmup: 20-search warm-up vs settle check
  • rehearsal: rehearsal 5 s vs rehearsal 30 s
  • build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v6-final
  • duckdb pass median MHz engine/client: (3597, 3592) vs (3593, 3592)
  • searchSettings recorded in one run only
Searches per second, eight searchers at once: 144.95%, duckdb/oracle
runs 20261005-031556-eshoponweb, 20261006-142724-eshoponweb; values 0.089, 0.217
differences between the two runs
  • turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1)
  • uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e)
  • warmup: 20-search warm-up vs settle check with level test
  • rehearsal: rehearsal 5 s vs rehearsal 30 s
  • build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final
  • duckdb pass median MHz engine/client: (3597, 3592) vs (3492, 3492)
  • searchSettings recorded in one run only
150.00%
mariadb
  • durability
    Before: innodb_flush_log_at_trx_commit=2 (mariadb.compose.yaml): the InnoDB redo log is written to the operating system at every commit but fsynced about once a second, so a crash of the mariadbd process loses nothing, while an operating-system crash or power cut can lose the last second of commits; innodb_doublewrite is on (default), the binary log is off, and the vector graph is an InnoDB table under the same log (settings read from the running server with SHOW VARIABLES; the crash behaviour is InnoDB's documented behaviour for this setting and was not tested, because gvb-mariadb is shared and stays up)
    After: innodb_flush_log_at_trx_commit=2 (set in mariadb-bench.compose.yaml for the benchmark's own container gvbbench-mariadb, and in mariadb.compose.yaml for the daily gvb-mariadb, which has the same server settings): the InnoDB redo log is written to the operating system at every commit but fsynced about once a second, so a crash of the mariadbd process loses nothing, while an operating-system crash or power cut can lose the last second of commits; innodb_doublewrite is on (default), the binary log is off, and the vector graph is an InnoDB table under the same log (settings read from the running server with SHOW VARIABLES; the crash behaviour is InnoDB's documented behaviour for this setting and was not tested on either container)
v5, 3 runs
runs20261005-023459-eshoponweb, 20261005-031556-eshoponweb, 20261005-035711-eshoponweb
v6, v7, v8, 9 runs
runs20261005-073329-eshoponweb, 20261005-085448-eshoponweb, 20261005-101815-eshoponweb, 20261006-130619-eshoponweb, 20261006-142724-eshoponweb, 20261006-154837-eshoponweb, 20261007-205106-eshoponweb, 20261007-221429-eshoponweb, 20261007-233551-eshoponweb
p50 latency in exact mode, milliseconds: 4.09%, mariadb
runs 20261005-031556-eshoponweb, 20261006-154837-eshoponweb; values 1.58, 1.645
differences between the two runs
  • turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1)
  • uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e)
  • warmup: 20-search warm-up vs settle check with level test
  • rehearsal: rehearsal 5 s vs rehearsal 30 s
  • build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final
  • mariadb pass median MHz engine/client: (3592, 3592) vs (3492, 3492)
  • searchSettings recorded in one run only
Searches per second, eight searchers at once: 17.85%, mariadb/oracle
runs 20261005-031556-eshoponweb, 20261006-142724-eshoponweb; values 1.892, 2.229
differences between the two runs
  • turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1)
  • uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e)
  • warmup: 20-search warm-up vs settle check with level test
  • rehearsal: rehearsal 5 s vs rehearsal 30 s
  • build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final
  • searchSettings recorded in one run only
45.00%
sqlitevec
  • index
    Before: vec0 brute-force scan, no ANN index (exact), float32, cosine distance, default chunk_size=1024; score = 1 - cosine distance
    After: vec0 brute-force scan, no ANN index (exact), float32, cosine distance, default chunk_size=1024; score = 1 - cosine distance; searches run concurrently, one WAL reader connection per searcher (opened as searchers arrive, at most 32), writes run one at a time and may overlap searches
v5, 3 runs
runs20261005-023459-eshoponweb, 20261005-031556-eshoponweb, 20261005-035711-eshoponweb
v6, v7, v8, 9 runs
runs20261005-073329-eshoponweb, 20261005-085448-eshoponweb, 20261005-101815-eshoponweb, 20261006-130619-eshoponweb, 20261006-142724-eshoponweb, 20261006-154837-eshoponweb, 20261007-205106-eshoponweb, 20261007-221429-eshoponweb, 20261007-233551-eshoponweb
Searches per second, eight searchers at once: 119.36%, sqlitevec
runs 20261005-031556-eshoponweb, 20261005-073329-eshoponweb; values 529.463, 1161.41
differences between the two runs
  • warmup: 20-search warm-up vs settle check
  • rehearsal: rehearsal 5 s vs rehearsal 30 s
  • build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v6-final
  • sqlitevec pass median MHz engine/client: (3598, 3592) vs (3592, 3592)
  • searchSettings recorded in one run only
Searches per second, eight searchers at once: 155.08%, oracle/sqlitevec
runs 20261005-031556-eshoponweb, 20261006-142724-eshoponweb; values 5.96, 2.337
differences between the two runs
  • turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1)
  • uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e)
  • warmup: 20-search warm-up vs settle check with level test
  • rehearsal: rehearsal 5 s vs rehearsal 30 s
  • build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final
  • searchSettings recorded in one run only
  • sqlitevec pass median MHz engine/client: (3598, 3592) vs (3492, 3492)
165.00%
Basis figures
KindMetricMoveEnginesRunsValuesDifferences
oneEnginep50Ms15.28%redis20261005-035711-eshoponweb, 20261006-154837-eshoponweb0.346, 0.399turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1); uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e); warmup: 20-search warm-up vs settle check with level test; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final; searchSettings recorded in one run only
oneEngineqps111.49%mongodb20261006-130619-eshoponweb, 20261006-154837-eshoponweb691.043, 770.419
oneEngineqps827.36%clickhouse20261006-142724-eshoponweb, 20261007-205106-eshoponweb428.473, 336.453build: ~/gvb-work/lanes/v7-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)
oneEngineexactP50Ms20.23%redis20261005-035711-eshoponweb, 20261006-142724-eshoponweb0.318, 0.382turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1); uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e); warmup: 20-search warm-up vs settle check with level test; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final; searchSettings recorded in one run only
pairp50Ms26.34%mongodb/redis20261005-035711-eshoponweb, 20261006-154837-eshoponweb4.001, 3.167turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1); uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e); warmup: 20-search warm-up vs settle check with level test; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final; searchSettings recorded in one run only
pairqps119.33%mongodb/pgvector20261005-085448-eshoponweb, 20261006-154837-eshoponweb0.578, 0.69turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1); uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e); warmup: settle check vs settle check with level test; build: ~/gvb-work/lanes/v6-final vs ~/gvb-work/lanes/v7-final
pairqps835.82%clickhouse/oracle20261006-142724-eshoponweb, 20261007-205106-eshoponweb0.161, 0.119build: ~/gvb-work/lanes/v7-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)
pairexactP50Ms19.66%qdrant-hnsw/redis20261005-035711-eshoponweb, 20261006-142724-eshoponweb2.798, 2.338turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1); uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e); warmup: 20-search warm-up vs settle check with level test; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final; searchSettings recorded in one run only
oneEngineSameSettingsp50Ms12.02%mongodb20261006-130619-eshoponweb, 20261006-154837-eshoponweb1.414, 1.262
oneEngineSameSettingsqps111.49%mongodb20261006-130619-eshoponweb, 20261006-154837-eshoponweb691.043, 770.419
oneEngineSameSettingsqps827.36%clickhouse20261006-142724-eshoponweb, 20261007-205106-eshoponweb428.473, 336.453build: ~/gvb-work/lanes/v7-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)
oneEngineSameSettingsexactP50Ms7.74%opensearch20261006-130619-eshoponweb, 20261007-205106-eshoponweb2.75, 2.553build: ~/gvb-work/lanes/v7-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)
pairSameSettingsp50Ms18.88%mongodb/redis20261006-154837-eshoponweb, 20261007-205106-eshoponweb3.167, 3.765build: ~/gvb-work/lanes/v7-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)
pairSameSettingsqps114.01%mongodb/sqlitevec20261006-154837-eshoponweb, 20261007-233551-eshoponweb1.521, 1.334build: ~/gvb-work/lanes/v7-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c); sqlitevec pass median MHz engine/client: (3492, 3492) vs (3499, 3492)
pairSameSettingsqps835.82%clickhouse/oracle20261006-142724-eshoponweb, 20261007-205106-eshoponweb0.161, 0.119build: ~/gvb-work/lanes/v7-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)
pairSameSettingsexactP50Ms8.41%opensearch/sqlitevec20261006-130619-eshoponweb, 20261007-205106-eshoponweb1.443, 1.331build: ~/gvb-work/lanes/v7-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c); sqlitevec pass median MHz engine/client: (3492, 3492) vs (3493, 3492)
oneEngineExclusionsKept.oneEnginep50Ms15.28%redis20261005-035711-eshoponweb, 20261006-154837-eshoponweb0.346, 0.399turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1); uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e); warmup: 20-search warm-up vs settle check with level test; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final; searchSettings recorded in one run only
oneEngineExclusionsKept.oneEnginep50Ms15.61%clickhouse20261005-035711-eshoponweb, 20261005-101815-eshoponweb5.2, 4.498warmup: 20-search warm-up vs settle check; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v6-final; clickhouse pass median MHz engine/client: (3592, 3591) vs (3590, 3590); searchSettings recorded in one run only
oneEngineExclusionsKept.oneEngineqps111.49%mongodb20261006-130619-eshoponweb, 20261006-154837-eshoponweb691.043, 770.419
oneEngineExclusionsKept.oneEngineqps121.81%clickhouse20261005-035711-eshoponweb, 20261005-073329-eshoponweb176.632, 215.155warmup: 20-search warm-up vs settle check; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v6-final; clickhouse pass median MHz engine/client: (3592, 3591) vs (3574, 3585); searchSettings recorded in one run only
oneEngineExclusionsKept.oneEngineqps874.42%vespa20261005-031556-eshoponweb, 20261005-101815-eshoponweb914.636, 1595.231warmup: 20-search warm-up vs settle check; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v6-final; vespa pass median MHz engine/client: (3501, 3497) vs (3492, 3493); searchSettings recorded in one run only
oneEngineExclusionsKept.oneEngineqps827.36%clickhouse20261006-142724-eshoponweb, 20261007-205106-eshoponweb428.473, 336.453build: ~/gvb-work/lanes/v7-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)
oneEngineExclusionsKept.oneEngineexactP50Ms20.23%redis20261005-035711-eshoponweb, 20261006-142724-eshoponweb0.318, 0.382turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1); uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e); warmup: 20-search warm-up vs settle check with level test; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final; searchSettings recorded in one run only
pairExclusionsKept.pairp50Ms26.34%mongodb/redis20261005-035711-eshoponweb, 20261006-154837-eshoponweb4.001, 3.167turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1); uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e); warmup: 20-search warm-up vs settle check with level test; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final; searchSettings recorded in one run only
pairExclusionsKept.pairqps119.33%mongodb/pgvector20261005-085448-eshoponweb, 20261006-154837-eshoponweb0.578, 0.69turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1); uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e); warmup: settle check vs settle check with level test; build: ~/gvb-work/lanes/v6-final vs ~/gvb-work/lanes/v7-final
pairExclusionsKept.pairqps128.15%clickhouse/redis20261005-035711-eshoponweb, 20261005-101815-eshoponweb0.065, 0.083warmup: 20-search warm-up vs settle check; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v6-final; clickhouse pass median MHz engine/client: (3592, 3591) vs (3590, 3590); searchSettings recorded in one run only
pairExclusionsKept.pairqps895.64%oracle/vespa20261005-031556-eshoponweb, 20261006-142724-eshoponweb3.45, 1.763turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1); uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e); warmup: 20-search warm-up vs settle check with level test; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final; searchSettings recorded in one run only; vespa pass median MHz engine/client: (3501, 3497) vs (3492, 3492)
pairExclusionsKept.pairqps835.82%clickhouse/oracle20261006-142724-eshoponweb, 20261007-205106-eshoponweb0.161, 0.119build: ~/gvb-work/lanes/v7-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)
pairExclusionsKept.pairexactP50Ms19.66%qdrant-hnsw/redis20261005-035711-eshoponweb, 20261006-142724-eshoponweb2.798, 2.338turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1); uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e); warmup: 20-search warm-up vs settle check with level test; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final; searchSettings recorded in one run only
oneEngineNoMachineControlp50Ms112.82%typesense20261004-130858-eshoponweb, 20261004-132735-eshoponweb11.887, 5.585
oneEngineNoMachineControlqps142.45%typesense20261003-184445-eshoponweb, 20261004-132735-eshoponweb95.424, 135.927
oneEngineNoMachineControlqps884.28%chroma20261003-184445-eshoponweb, 20261004-132735-eshoponweb330.898, 609.761
oneEngineNoMachineControlexactP50Ms69.68%typesense20261004-130858-eshoponweb, 20261004-132735-eshoponweb12.497, 7.365
pairNoMachineControlp50Ms148.82%mariadb/typesense20261004-130858-eshoponweb, 20261004-132735-eshoponweb0.142, 0.354
pairNoMachineControlqps194.55%mongodb/typesense20261003-184445-eshoponweb, 20261004-132735-eshoponweb3.225, 1.657
pairNoMachineControlqps8147.88%chroma/oracle20261003-184445-eshoponweb, 20261004-130858-eshoponweb0.476, 1.18
pairNoMachineControlexactP50Ms123.91%duckdb/typesense20261004-130858-eshoponweb, 20261004-132735-eshoponweb0.358, 0.802
maxMove-35.82%clickhouse/oracle20261006-142724-eshoponweb, 20261007-205106-eshoponweb0.161, 0.119build: ~/gvb-work/lanes/v7-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)
exclusionsKept.oneEngine-74.42%vespa20261005-031556-eshoponweb, 20261005-101815-eshoponweb914.636, 1595.231warmup: 20-search warm-up vs settle check; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v6-final; vespa pass median MHz engine/client: (3501, 3497) vs (3492, 3493); searchSettings recorded in one run only
exclusionsKept.oneEngine-27.36%clickhouse20261006-142724-eshoponweb, 20261007-205106-eshoponweb428.473, 336.453build: ~/gvb-work/lanes/v7-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)
exclusionsKept.pair-95.64%oracle/vespa20261005-031556-eshoponweb, 20261006-142724-eshoponweb3.45, 1.763turbo: turbo not pinned (no no_turbo change recorded) vs turbo off (no_turbo 0 -> 1); uncore: uncore not pinned vs uncore pinned (MSR 0x620 = 0x1e1e); warmup: 20-search warm-up vs settle check with level test; rehearsal: rehearsal 5 s vs rehearsal 30 s; build: ~/gvb-work/lanes/v5-final vs ~/gvb-work/lanes/v7-final; searchSettings recorded in one run only; vespa pass median MHz engine/client: (3501, 3497) vs (3492, 3492)
exclusionsKept.pair-35.82%clickhouse/oracle20261006-142724-eshoponweb, 20261007-205106-eshoponweb0.161, 0.119build: ~/gvb-work/lanes/v7-final vs ~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)
oneEngine without machine control-112.82%typesense20261004-130858-eshoponweb, 20261004-132735-eshoponweb11.887, 5.585
pair without machine control-148.82%mariadb/typesense20261004-130858-eshoponweb, 20261004-132735-eshoponweb0.142, 0.354

Exclusions

targetseedsmetrickindwhysourceitemevidenceseedEvidence
vespa502, 503qps8method defectQPS@8 ran first in runs 502 and 503 (914.6 and 977.3 QPS) against 1550.0 in run 501, where it ran after the exact pass; cause inferred, not proven (JVM warm-up).design/verdicts/v5-verdict.txt2cold, The @8 pass ran first in runs 502 and 503runs 502 and 503
elasticsearch503qps8method defectElasticsearch QPS@8 shows the same effect: run 503 read 2335, the one run where it was the first pass; cause inferred, not proven.design/verdicts/v5-verdict.txt2Elasticsearch QPS@8 shows the same effect, run 503, the one run where @8 was its first pass, coldrun 503
clickhouse501, 502, 503*unrecorded config change21 of ClickHouse's built-in log tables were switched off after the v5 runs ended; the v5 results do not say so.design/verdicts/v6-verdict.md121 of ClickHouse's built-in log tables, after the v5 runs ended at 04:38, Nothing in results.json, results.md or consolidated.md mentions itafter the v5 runs ended

Folders left out

folderreason
20261003-183955-eshoponwebmachineControl not recorded
20261003-184207-eshoponwebmachineControl not recorded
20261003-184445-eshoponwebmachineControl not recorded
20261003-234838-eshoponwebmachineControl not recorded
20261004-130858-eshoponwebmachineControl not recorded
20261004-132735-eshoponwebmachineControl not recorded

Basis runs

folderseedsessionstartedUtcturbouncorewarmuprehearsalbuildmachineControl
20261005-023459-eshoponweb501v52026-10-05T02:34:59Zturbo not pinned (no no_turbo change recorded)uncore not pinned20-search warm-uprehearsal 5 s~/gvb-work/lanes/v5-finalon
20261005-031556-eshoponweb502v52026-10-05T03:15:56Zturbo not pinned (no no_turbo change recorded)uncore not pinned20-search warm-uprehearsal 5 s~/gvb-work/lanes/v5-finalon
20261005-035711-eshoponweb503v52026-10-05T03:57:11Zturbo not pinned (no no_turbo change recorded)uncore not pinned20-search warm-uprehearsal 5 s~/gvb-work/lanes/v5-finalon
20261005-073329-eshoponweb601v62026-10-05T07:33:29Zturbo not pinned (no no_turbo change recorded)uncore not pinnedsettle checkrehearsal 30 s~/gvb-work/lanes/v6-finalon
20261005-085448-eshoponweb602v62026-10-05T08:54:48Zturbo not pinned (no no_turbo change recorded)uncore not pinnedsettle checkrehearsal 30 s~/gvb-work/lanes/v6-finalon
20261005-101815-eshoponweb603v62026-10-05T10:18:15Zturbo not pinned (no no_turbo change recorded)uncore not pinnedsettle checkrehearsal 30 s~/gvb-work/lanes/v6-finalon
20261006-130619-eshoponweb701v72026-10-06T13:06:19Zturbo off (no_turbo 0 -> 1)uncore pinned (MSR 0x620 = 0x1e1e)settle check with level testrehearsal 30 s~/gvb-work/lanes/v7-finalon
20261006-142724-eshoponweb702v72026-10-06T14:27:24Zturbo off (no_turbo 0 -> 1)uncore pinned (MSR 0x620 = 0x1e1e)settle check with level testrehearsal 30 s~/gvb-work/lanes/v7-finalon
20261006-154837-eshoponweb703v72026-10-06T15:48:37Zturbo off (no_turbo 0 -> 1)uncore pinned (MSR 0x620 = 0x1e1e)settle check with level testrehearsal 30 s~/gvb-work/lanes/v7-finalon
20261007-205106-eshoponweb801v82026-10-07T20:51:06Zturbo off (no_turbo 0 -> 1)uncore pinned (MSR 0x620 = 0x1e1e)settle check with level testrehearsal 30 s~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)on
20261007-221429-eshoponweb802v82026-10-07T22:14:29Zturbo off (no_turbo 0 -> 1)uncore pinned (MSR 0x620 = 0x1e1e)settle check with level testrehearsal 30 s~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)on
20261007-233551-eshoponweb803v82026-10-07T23:35:51Zturbo off (no_turbo 0 -> 1)uncore pinned (MSR 0x620 = 0x1e1e)settle check with level testrehearsal 30 s~/gvb-work/v8-run/bin/GenericVectorBuilder.Bench.dll (commit 9b924200abc3f2c3e41c2a9520e5c7bb16748e6c)on

Drift between sessions

From v7 to v8, a ranked figure's session median moved 1.43% in the middle case and 4.66% at most (opensearch, exact p50).

sources
  • consolidated consolidated:drift.medianAbsMoveBp|bp-pct = 1.43
  • consolidated consolidated:drift.largestAbsMoveBp|bp-pct = 4.66
  • consolidated consolidated:drift.largest.target = opensearch

The NOT HELD clickhouse QPS@8 cell is left out of these figures; its session median moved 13.36%, with v7 runs at 375 to 428 and v8 runs at 336 to 380.

sources
  • consolidated consolidated:drift.excluded[0].target = clickhouse
  • consolidated consolidated:drift.excluded[0].absMoveBp|bp-pct = 13.36
  • consolidated consolidated:drift.excluded[0].fromMin = 375
  • consolidated consolidated:drift.excluded[0].fromMax = 428
  • consolidated consolidated:drift.excluded[0].toMin = 336
  • consolidated consolidated:drift.excluded[0].toMax = 380

6 orders held in v7 and not in v8, and 9 the other way; they are listed and not published.

sources
  • consolidated consolidated:drift.unconfirmedFromFirst = 6
  • consolidated consolidated:drift.unconfirmedFromSecond = 9

20 unordered pairs sat between 1.35 and 1.45 times in each session, always in one direction; they are listed as close to the line.

sources
  • consolidated consolidated:drift.closeCount = 20
  • consolidated consolidated:drift.closeFromBp|bp-ratio = 1.35
  • consolidated consolidated:threshold.tBp|bp-ratio = 1.45

1 ordered pair cleared 1.45 times by 25 bp or less in its lowest session; it is listed as on the line.

sources
  • consolidated consolidated:drift.onLineCount = 1
  • consolidated consolidated:threshold.tBp|bp-ratio = 1.45
  • consolidated consolidated:drift.onLineBp = 25

The sessions differ in build, day and outside load, and this test does not separate those from the engines' own drift.

sources
  • consolidated consolidated:drift.sessionDifferences[0] = build
  • consolidated consolidated:drift.sessionDifferences[1] = day
  • consolidated consolidated:drift.sessionDifferences[2] = outside load

The median outside load of a pass, per run, was 0.2095 to 0.2135 CPUs in v7 and 0.14 to 0.1435 in v8.

sources
  • consolidated consolidated:drift.outsideLoad[0].minCpus = 0.2095
  • consolidated consolidated:drift.outsideLoad[0].maxCpus = 0.2135
  • consolidated consolidated:drift.outsideLoad[0].session = v7
  • consolidated consolidated:drift.outsideLoad[1].minCpus = 0.14
  • consolidated consolidated:drift.outsideLoad[1].maxCpus = 0.1435
  • consolidated consolidated:drift.outsideLoad[1].session = v8

Both sessions ran with the clock held; drift under other conditions is not measured here.

no sources recorded

First session v7; second session v8; median absolute move 1.43%; largest move opensearch, exactP50Ms, -4.66%

Enginep50 latency of one search, millisecondsSearches per second, one searcherSearches per second, eight searchers at oncep50 latency in exact mode, milliseconds
redis-2.74%2.38%3.67%-3.41%
mariadb-0.93%0.73%0.16%-0.87%
pgvector-2.79%2.62%2.15%-2.62%
qdrant0.74%-0.41%0.40%-
qdrant-hnsw0.40%-0.23%0.70%0.46%
oracle0.11%-0.10%0.65%-1.47%
elasticsearch-1.19%1.08%1.60%-1.87%
mongodb-1.82%2.19%0.71%-0.90%
sqlitevec-1.57%2.10%-0.17%-1.00%
vespa-2.03%1.83%2.92%-2.64%
opensearch-2.19%2.09%2.08%-4.66%
chroma-1.24%1.38%1.73%-
milvus-3.44%3.89%0.96%-
sql-diskann-3.15%3.39%1.69%-3.56%
duckdb-0.85%0.75%0.85%-1.40%
sql-2.89%3.08%-3.68%-
typesense-0.54%0.79%-0.39%-0.68%
clickhouse-1.98%1.95%--0.67%
weaviate-0.67%0.74%0.26%-

Orders that held in one session and not in both

Pairs close to the line

Ordered pairs on the line

Disclosures

In v7, every run held the clock: turbo off, MSR 0x620 at 0x1e1e, top ratio 35 (nominally 3500 MHz); the median of the kernel's pass medians is 3492 MHz; the ceiling before was 3600 MHz.

sources
  • file src/GenericVectorBuilder.Bench/Running/MachineControlSampler.cs#LIMIT_MSR = "0x620" = LIMIT_MSR = "0x620"
  • consolidated consolidated:clock.perSession.v7.uncore = 0x1e1e
  • consolidated consolidated:clock.perSession.v7.pinnedMhz = 3500
  • consolidated consolidated:clock.perSession.v7.kernelMedianMhz = 3492
  • consolidated consolidated:clock.perSession.v7.ceilingBeforeMhz = 3600
  • consolidated consolidated:clock.perSession.v7.noTurbo = 1
  • consolidated consolidated:clock.perSession.v7.pinnedRatio = 35
  • file src/GenericVectorBuilder.Bench/Stats/ConsolidateClock.cs#public const int RATIO_STEP_MHZ = 100; = public const int RATIO_STEP_MHZ = 100;

The median rule: a pass is off when the median, over its engine CPUs or over its client CPUs, of each CPU's median MHz is more than 1% from the pinned 3500 MHz.

sources
  • consolidated consolidated:clock.perSession.v7.toleranceBp|bp-pct = 1
  • consolidated consolidated:clock.perSession.v7.pinnedMhz = 3500

In v7, by the median rule, 0 of 156 passes were off the pinned clock and 0 had a CPU group not read.

sources
  • consolidated consolidated:clock.perSession.v7.clockOffPasses = 0
  • consolidated consolidated:clock.perSession.v7.passesEvaluated = 156
  • consolidated consolidated:clock.perSession.v7.clockUnreadPasses = 0

In v8, every run held the clock: turbo off, MSR 0x620 at 0x1e1e, top ratio 35 (nominally 3500 MHz); the median of the kernel's pass medians is 3492 MHz; the ceiling before was 3600 MHz.

sources
  • file src/GenericVectorBuilder.Bench/Running/MachineControlSampler.cs#LIMIT_MSR = "0x620" = LIMIT_MSR = "0x620"
  • consolidated consolidated:clock.perSession.v8.uncore = 0x1e1e
  • consolidated consolidated:clock.perSession.v8.pinnedMhz = 3500
  • consolidated consolidated:clock.perSession.v8.kernelMedianMhz = 3492
  • consolidated consolidated:clock.perSession.v8.ceilingBeforeMhz = 3600
  • consolidated consolidated:clock.perSession.v8.noTurbo = 1
  • consolidated consolidated:clock.perSession.v8.pinnedRatio = 35
  • file src/GenericVectorBuilder.Bench/Stats/ConsolidateClock.cs#public const int RATIO_STEP_MHZ = 100; = public const int RATIO_STEP_MHZ = 100;

In v8, by the median rule, 0 of 156 passes were off the pinned clock and 0 had a CPU group not read.

sources
  • consolidated consolidated:clock.perSession.v8.clockOffPasses = 0
  • consolidated consolidated:clock.perSession.v8.passesEvaluated = 156
  • consolidated consolidated:clock.perSession.v8.clockUnreadPasses = 0

Run 20261006-130619-eshoponweb flagged oracle's eight-searcher pass as off its clock by a mean; the medians read 3492 MHz on engine CPUs and 3492 MHz on client CPUs, within 1%.

sources
  • consolidated consolidated:clock.droppedWarnings[0].run = 20261006-130619-eshoponweb
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-130619-eshoponweb].folder = 20261006-130619-eshoponweb
  • consolidated consolidated:clock.droppedWarnings[0].engineMedianMhz = 3492
  • consolidated consolidated:clock.droppedWarnings[0].clientMedianMhz = 3492
  • consolidated consolidated:clock.perSession.v7.toleranceBp|bp-pct = 1

Run 20261006-142724-eshoponweb flagged oracle's eight-searcher pass as off its clock by a mean; the medians read 3492 MHz on engine CPUs and 3492 MHz on client CPUs, within 1%.

sources
  • consolidated consolidated:clock.droppedWarnings[1].run = 20261006-142724-eshoponweb
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-142724-eshoponweb].folder = 20261006-142724-eshoponweb
  • consolidated consolidated:clock.droppedWarnings[1].engineMedianMhz = 3492
  • consolidated consolidated:clock.droppedWarnings[1].clientMedianMhz = 3492
  • consolidated consolidated:clock.perSession.v7.toleranceBp|bp-pct = 1

Run 20261006-154837-eshoponweb flagged oracle's eight-searcher pass as off its clock by a mean; the medians read 3492 MHz on engine CPUs and 3492 MHz on client CPUs, within 1%.

sources
  • consolidated consolidated:clock.droppedWarnings[2].run = 20261006-154837-eshoponweb
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-154837-eshoponweb].folder = 20261006-154837-eshoponweb
  • consolidated consolidated:clock.droppedWarnings[2].engineMedianMhz = 3492
  • consolidated consolidated:clock.droppedWarnings[2].clientMedianMhz = 3492
  • consolidated consolidated:clock.perSession.v7.toleranceBp|bp-pct = 1

Every claim run used the performance governor, with the client on CPUs 0-1,4-5.

sources
  • results results:conditions.governor = performance
  • results results:conditions.clientCpus = 0-1,4-5

The container engines clickhouse, vespa, oracle, elasticsearch, sql, pgvector, qdrant, opensearch, qdrant-hnsw, redis, milvus, mariadb, weaviate, mongodb, chroma, typesense and sql-diskann ran on CPUs 2-3,6-7.

sources
  • results results:conditions.engines[target=clickhouse].cpus = 2-3,6-7
  • results results:conditions.engines[target=clickhouse].hosting = compose
  • results results:conditions.engines[target=vespa].cpus = 2-3,6-7
  • results results:conditions.engines[target=vespa].hosting = compose
  • results results:conditions.engines[target=oracle].cpus = 2-3,6-7
  • results results:conditions.engines[target=oracle].hosting = compose
  • results results:conditions.engines[target=elasticsearch].cpus = 2-3,6-7
  • results results:conditions.engines[target=elasticsearch].hosting = compose
  • results results:conditions.engines[target=sql].cpus = 2-3,6-7
  • results results:conditions.engines[target=sql].hosting = compose
  • results results:conditions.engines[target=pgvector].cpus = 2-3,6-7
  • results results:conditions.engines[target=pgvector].hosting = compose
  • results results:conditions.engines[target=qdrant].cpus = 2-3,6-7
  • results results:conditions.engines[target=qdrant].hosting = compose
  • results results:conditions.engines[target=opensearch].cpus = 2-3,6-7
  • results results:conditions.engines[target=opensearch].hosting = compose
  • results results:conditions.engines[target=qdrant-hnsw].cpus = 2-3,6-7
  • results results:conditions.engines[target=qdrant-hnsw].hosting = compose
  • results results:conditions.engines[target=redis].cpus = 2-3,6-7
  • results results:conditions.engines[target=redis].hosting = compose
  • results results:conditions.engines[target=milvus].cpus = 2-3,6-7
  • results results:conditions.engines[target=milvus].hosting = compose
  • results results:conditions.engines[target=mariadb].cpus = 2-3,6-7
  • results results:conditions.engines[target=mariadb].hosting = compose
  • results results:conditions.engines[target=weaviate].cpus = 2-3,6-7
  • results results:conditions.engines[target=weaviate].hosting = compose
  • results results:conditions.engines[target=mongodb].cpus = 2-3,6-7
  • results results:conditions.engines[target=mongodb].hosting = compose
  • results results:conditions.engines[target=chroma].cpus = 2-3,6-7
  • results results:conditions.engines[target=chroma].hosting = compose
  • results results:conditions.engines[target=typesense].cpus = 2-3,6-7
  • results results:conditions.engines[target=typesense].hosting = compose
  • results results:conditions.engines[target=sql-diskann].cpus = 2-3,6-7
  • results results:conditions.engines[target=sql-diskann].hosting = compose

The embedded engines sqlitevec and duckdb ran inside the client process on CPUs 0-1,4-5.

sources
  • results results:conditions.engines[target=sqlitevec].cpus = 0-1,4-5
  • results results:conditions.engines[target=sqlitevec].hosting = embedded
  • results results:conditions.engines[target=duckdb].cpus = 0-1,4-5
  • results results:conditions.engines[target=duckdb].hosting = embedded

Every v8 run recorded boot a2f94313-eeda-460c-8474-8a9ee898f123 at 2026-10-03T15:53:39Z, before the first v7 run started at 2026-10-06T13:06:19Z, so v7 ran on that boot too.

sources
  • results results@20261007-205106-eshoponweb:conditions.boot.bootId = a2f94313-eeda-460c-8474-8a9ee898f123
  • results results@20261007-221429-eshoponweb:conditions.boot.bootId = a2f94313-eeda-460c-8474-8a9ee898f123
  • results results@20261007-233551-eshoponweb:conditions.boot.bootId = a2f94313-eeda-460c-8474-8a9ee898f123
  • results results@20261007-205106-eshoponweb:conditions.boot.bootTimeUtc = 2026-10-03T15:53:39Z
  • results results@20261007-221429-eshoponweb:conditions.boot.bootTimeUtc = 2026-10-03T15:53:39Z
  • results results@20261007-233551-eshoponweb:conditions.boot.bootTimeUtc = 2026-10-03T15:53:39Z
  • results results@20261006-130619-eshoponweb:startedUtc = 2026-10-06T13:06:19Z

Each of the 17 container targets ran one image id, equal to its pin, in every v8 run; the ids are in the images table.

sources
  • consolidated consolidated:imageTargets = 17
  • consolidated consolidated:images[target=clickhouse].id = sha256:3a91276f066905da0edbbd622d3fc2a2df632c87ea7fe32ef4e74fdf8c9567b0
  • consolidated consolidated:images[target=vespa].id = sha256:5c30f5c41e7563498c4f925db6a837a3848f04726a3ed26aed4a7c8ab69f18fd
  • consolidated consolidated:images[target=oracle].id = sha256:f5ff19033860d662c821cb04eb10483fa94f14f78eae252d054291ea07028093
  • consolidated consolidated:images[target=elasticsearch].id = sha256:e23d4758358a4e356cc2ef3259a5a6f345cacc1722c10dffe6d7150a1a78e52f
  • consolidated consolidated:images[target=sql].id = sha256:2b5b581621126574f3d1f75e78d3eebe8d05aedb59ad0cfdf9aa42cb0634d726
  • consolidated consolidated:images[target=pgvector].id = sha256:7a7e9f22015b67edb4bef5c59daeebcd7e74bfa570df6ce60ae01237c8648a84
  • consolidated consolidated:images[target=qdrant].id = sha256:f1c7272cdac52b38c1a0e89313922d940ba50afd90d593a1605dbbc214e66ffb
  • consolidated consolidated:images[target=opensearch].id = sha256:adfa61f85025d06b4aeb562e7e74fde7e31c437039c93c3862c17e9acebd6c7c
  • consolidated consolidated:images[target=qdrant-hnsw].id = sha256:f1c7272cdac52b38c1a0e89313922d940ba50afd90d593a1605dbbc214e66ffb
  • consolidated consolidated:images[target=redis].id = sha256:6f81e8915c60b065a524e6967e0ad1c639ba6efa84d669f823683ea04d9150ee
  • consolidated consolidated:images[target=milvus].id = sha256:29f7668e64df1c6d5cdadbfbee99f38c72e4001054f149a298725acae57230ad
  • consolidated consolidated:images[target=mariadb].id = sha256:6422478cb8e159f080fb1d8ccf65101e26fe51385787fde7d16c3b165a331f15
  • consolidated consolidated:images[target=weaviate].id = sha256:f6f4a5961f99e8718a02c822ca6a0d65ed3f9c567734419a7b2144933014f13a
  • consolidated consolidated:images[target=mongodb].id = sha256:1985314b0ded756ba965e0f400d17406b7a89bec659d4763a490f42f006e4fbd
  • consolidated consolidated:images[target=chroma].id = sha256:1e0b73a187a28757c572acba508c46f48c9e8b0acaf5c20e6d95cdedce1acdf6
  • consolidated consolidated:images[target=typesense].id = sha256:610f2d34b1f93d00762869da2c67736775e5798d19a2c8b91b014b8a0cc1e110
  • consolidated consolidated:images[target=sql-diskann].id = sha256:2b5b581621126574f3d1f75e78d3eebe8d05aedb59ad0cfdf9aa42cb0634d726

Each of those images was last tagged on this box before the first v7 run started at 2026-10-06T13:06:19Z.

sources
  • results results@20261006-130619-eshoponweb:startedUtc = 2026-10-06T13:06:19Z
  • consolidated consolidated:images[target=clickhouse].beforeFirstV7Start = true
  • consolidated consolidated:images[target=vespa].beforeFirstV7Start = true
  • consolidated consolidated:images[target=oracle].beforeFirstV7Start = true
  • consolidated consolidated:images[target=elasticsearch].beforeFirstV7Start = true
  • consolidated consolidated:images[target=sql].beforeFirstV7Start = true
  • consolidated consolidated:images[target=pgvector].beforeFirstV7Start = true
  • consolidated consolidated:images[target=qdrant].beforeFirstV7Start = true
  • consolidated consolidated:images[target=opensearch].beforeFirstV7Start = true
  • consolidated consolidated:images[target=qdrant-hnsw].beforeFirstV7Start = true
  • consolidated consolidated:images[target=redis].beforeFirstV7Start = true
  • consolidated consolidated:images[target=milvus].beforeFirstV7Start = true
  • consolidated consolidated:images[target=mariadb].beforeFirstV7Start = true
  • consolidated consolidated:images[target=weaviate].beforeFirstV7Start = true
  • consolidated consolidated:images[target=mongodb].beforeFirstV7Start = true
  • consolidated consolidated:images[target=chroma].beforeFirstV7Start = true
  • consolidated consolidated:images[target=typesense].beforeFirstV7Start = true
  • consolidated consolidated:images[target=sql-diskann].beforeFirstV7Start = true

redis holds its data in memory: its saved docs page says 'Redis is an in-memory but persistent on disk database'; its compose file sets save "300 1" and appendonly no.

sources
  • doc doc:design/engine-docs/redis-faq-2026-10-07.html#Redis is an in-memory but persistent on disk database = Redis is an in-memory but persistent on disk database
  • file deploy/engines/redis.compose.yaml#--save "300 1" = --save "300 1"
  • file deploy/engines/redis.compose.yaml#--appendonly no = --appendonly no

Each engine's durability text, as run 20261007-205106-eshoponweb recorded it, follows clause by clause with how each clause is backed; the program wrote the text, and its figures were not re-derived for this report.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Strace logs of measurements cited in those texts are saved for clickhouse, milvus, mongodb, qdrant and qdrant-hnsw, in design/engine-docs/durability-logs-2026-10-04, each listed with its hash in SHA256SUMS.

sources
  • file design/engine-docs/durability-logs-2026-10-04/index.json#"folder": "design/engine-docs/durability-logs-2026-10-04" = "folder": "design/engine-docs/durability-logs-2026-10-04"
  • file design/engine-docs/durability-logs-2026-10-04/index.json#"hashes": "SHA256SUMS" = "hashes": "SHA256SUMS"
  • file design/engine-docs/durability-logs-2026-10-04/index.json#"target": "clickhouse" = "target": "clickhouse"
  • file design/engine-docs/durability-logs-2026-10-04/index.json#"target": "milvus" = "target": "milvus"
  • file design/engine-docs/durability-logs-2026-10-04/index.json#"target": "mongodb" = "target": "mongodb"
  • file design/engine-docs/durability-logs-2026-10-04/index.json#"target": "qdrant" = "target": "qdrant"
  • file design/engine-docs/durability-logs-2026-10-04/index.json#"target": "qdrant-hnsw" = "target": "qdrant-hnsw"

No log is saved for the measurements cited in the durability texts of oracle, pgvector, sqlitevec, redis, weaviate, chroma, typesense and duckdb.

sources
  • results results@20261007-205106-eshoponweb:targets[oracle].durability#Measured 2026-10-04: 50 separate client commits = Measured 2026-10-04: 50 separate client commits
  • results results@20261007-205106-eshoponweb:targets[pgvector].durability#every commit is flushed to the write-ahead log b = every commit is flushed to the write-ahead log b
  • results results@20261007-205106-eshoponweb:targets[sqlitevec].durability#each commit is appended to the -wal file and han = each commit is appended to the -wal file and han
  • results results@20261007-205106-eshoponweb:targets[redis].durability#an RDB snapshot is written every 5 minutes if at = an RDB snapshot is written every 5 minutes if at
  • results results@20261007-205106-eshoponweb:targets[weaviate].durability#every object is appended to the LSM write-ahead = every object is appended to the LSM write-ahead
  • results results@20261007-205106-eshoponweb:targets[chroma].durability#every write is committed to chroma.sqlite3 with = every write is committed to chroma.sqlite3 with
  • results results@20261007-205106-eshoponweb:targets[typesense].durability#Every acknowledged write is appended to Typesens = Every acknowledged write is appended to Typesens
  • results results@20261007-205106-eshoponweb:targets[duckdb].durability#only spaces out the checkpoints that write the d = only spaces out the checkpoints that write the d

clickhouse: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

Acknowledged inserts are not fsynced. The sink creates plain MergeTree tables, so the MergeTree settings are the defaults: fsync_after_insert 0 and fsync_part_directory 0 (system.merge_tree_settings), and async_insert 1 with wait_for_async_insert 1 is the server default for the gvb login (system.settings), so an insert is acknowledged once its part is written, not once it is on disk.
sources
  • quote results@20261007-205106-eshoponweb:targets[clickhouse].durability

Typed in the program's own text; it cites a measurement that these runs did not repeat, and no saved source backs this clause:

no sources recorded

Measured 2026-10-04 with strace over 30 acknowledged single-row inserts (30 Ok rows in system.asynchronous_insert_log):
sources
  • quote results@20261007-205106-eshoponweb:targets[clickhouse].durability

Backed by a saved log or measurement, not read back from the engine in these runs:

sources
  • file design/engine-docs/durability-logs-2026-10-04/clickhouse-acknowledged-inserts.strace#SIGUSR1 = SIGUSR1
  • file design/engine-docs/durability-logs-2026-10-04/clickhouse-control-fsync-after-insert.strace#fdatasync = fdatasync
zero fsync, fdatasync or sync_file_range calls,
sources
  • quote results@20261007-205106-eshoponweb:targets[clickhouse].durability
while the control, a table created with fsync_after_insert=1, made 61 fdatasync calls
sources
  • quote results@20261007-205106-eshoponweb:targets[clickhouse].durability

Typed in the program's own text; it cites a measurement that these runs did not repeat, and no saved source backs this clause:

no sources recorded

for 5 inserts.
sources
  • quote results@20261007-205106-eshoponweb:targets[clickhouse].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

A host power loss or kernel crash can lose acknowledged rows that are still in the OS page cache; a ClickHouse process crash alone should not (inferred, not tested).
sources
  • quote results@20261007-205106-eshoponweb:targets[clickhouse].durability

vespa: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

Vespa's transaction log server fsyncs after each commit: searchlib.translogserver usefsync=true, and an operation is searchable when it is acknowledged: proton documentdb visibilitydelay=0. Neither is overridden by this sink or by the services.xml it deploys;
sources
  • quote results@20261007-205106-eshoponweb:targets[vespa].durability

Described by a test saved in this repository, which these runs did not run:

sources
  • file tests/GenericVectorBuilder.Engines.Tests/VespaReadinessTests.cs#usefsync = usefsync
VespaReadinessTests reads both from the live config server.
sources
  • quote results@20261007-205106-eshoponweb:targets[vespa].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

After a crash the node replays the transaction log over its last flushed data and rebuilds the in-memory HNSW graph. By those settings an acknowledged write survives a crash; this is read from the settings, not shown by pulling power.
sources
  • quote results@20261007-205106-eshoponweb:targets[vespa].durability

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file src/GenericVectorBuilder.Engines/Sinks/VespaApplicationPackage.cs#<min-redundancy>1</min-redundancy> = <min-redundancy>1</min-redundancy>
One node and min-redundancy 1,
sources
  • quote results@20261007-205106-eshoponweb:targets[vespa].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

so a lost disk loses the data.
sources
  • quote results@20261007-205106-eshoponweb:targets[vespa].durability

oracle: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

By these settings a committed row should survive a crash or power loss. The sink uses a plain COMMIT and commit_logging, commit_wait and commit_write are unset in the database, so every commit waits for its redo to be written.
sources
  • quote results@20261007-205106-eshoponweb:targets[oracle].durability

Typed in the program's own text; it cites a measurement that these runs did not repeat, and no saved source backs this clause:

no sources recorded

Measured 2026-10-04: 50 separate client commits raised V$SYSSTAT 'redo synch writes' by 55 (the 50 commits plus the CREATE and DROP of the probe table), and the log writer and the datafile writer hold their files open with O_DSYNC (open flags 02110002, filesystemio_options none).
sources
  • quote results@20261007-205106-eshoponweb:targets[oracle].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

The database runs NOARCHIVELOG (V$DATABASE.LOG_MODE), so redo serves crash recovery only and there is no point-in-time restore.
sources
  • quote results@20261007-205106-eshoponweb:targets[oracle].durability

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file deploy/engines/oracle-init/01-vector-memory.sh#POOL_SIZE=768M = POOL_SIZE=768M
The HNSW graph lives in the 768 MB vector memory pool (oracle-init/01-vector-memory.sh)
sources
  • quote results@20261007-205106-eshoponweb:targets[oracle].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

and is not the durable copy; the table is.
sources
  • quote results@20261007-205106-eshoponweb:targets[oracle].durability
Not tested by cutting power; whether the disk's own write cache reaches the media was not checked.
sources
  • quote results@20261007-205106-eshoponweb:targets[oracle].durability

Read from the running engine or the machine by the benchmark's own code, as the cited line shows:

sources
  • file src/GenericVectorBuilder.Engines/Sinks/OracleCpuCap.cs#cpu_count {CpuCount.ToString( CultureInfo.InvariantCulture )} in V$PARAMETER = cpu_count {CpuCount.ToString( CultureInfo.InvariantCulture )} in V$PARAMETER
CPU: Oracle Free caps itself at 2 CPUs (cpu_count 2 in V$PARAMETER, edition FREE in V$INSTANCE, 8 host CPUs in V$OSSTAT NUM_CPUS;
sources
  • quote results@20261007-205106-eshoponweb:targets[oracle].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

the 2 CPU thread limit is Oracle's documented Free edition limit).
sources
  • quote results@20261007-205106-eshoponweb:targets[oracle].durability

elasticsearch: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

Every acknowledged bulk request is fsynced to the translog before the answer: index.translog.durability=request, the Elasticsearch default, which neither this sink nor elasticsearch.compose.yaml overrides
sources
  • quote results@20261007-205106-eshoponweb:targets[elasticsearch].durability

Described by a test saved in this repository, which these runs did not run:

sources
  • file tests/GenericVectorBuilder.Engines.Tests/ElasticsearchReadinessTests.cs#index.translog.durability = index.translog.durability
(ElasticsearchReadinessTests reads it back from the live index).
sources
  • quote results@20261007-205106-eshoponweb:targets[elasticsearch].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

By that setting a process crash or power loss loses no acknowledged write; this is read from the setting, not shown by pulling power.
sources
  • quote results@20261007-205106-eshoponweb:targets[elasticsearch].durability

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchSink.cs#settings = new { number_of_shards = 1, number_of_replicas = 0 } = settings = new { number_of_shards = 1, number_of_replicas = 0 }
One node and no replicas,
sources
  • quote results@20261007-205106-eshoponweb:targets[elasticsearch].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

so a lost disk loses the data.
sources
  • quote results@20261007-205106-eshoponweb:targets[elasticsearch].durability

sql: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

A commit returns after its transaction-log records are written to disk (SQL Server write-ahead logging;
sources
  • quote results@20261007-205106-eshoponweb:targets[sql].durability

Read from the running engine or the machine by the benchmark's own code, as the cited line shows:

sources
  • file src/GenericVectorBuilder.Bench/Targets/SqlDurability.cs#SELECT name, recovery_model_desc, delayed_durability_desc, page_verify_option_desc FROM sys.databases = SELECT name, recovery_model_desc, delayed_durability_desc, page_verify_option_desc FROM sys.databases
delayed durability is DISABLED);
sources
  • quote results@20261007-205106-eshoponweb:targets[sql].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

a database created here copies the model database:
sources
  • quote results@20261007-205106-eshoponweb:targets[sql].durability

Read from the running engine or the machine by the benchmark's own code, as the cited line shows:

sources
  • file src/GenericVectorBuilder.Bench/Targets/SqlDurability.cs#SELECT name, recovery_model_desc, delayed_durability_desc, page_verify_option_desc FROM sys.databases = SELECT name, recovery_model_desc, delayed_durability_desc, page_verify_option_desc FROM sys.databases
  • file src/GenericVectorBuilder.Bench/Targets/SqlDurability.cs#DBCC TRACESTATUS( -1 ) WITH NO_INFOMSGS; = DBCC TRACESTATUS( -1 ) WITH NO_INFOMSGS;
  • file src/GenericVectorBuilder.Bench/Targets/SqlDurability.cs#ConfigFiles.ExistsWithSudoAsync( confPath, ct ) = ConfigFiles.ExistsWithSudoAsync( confPath, ct )
recovery model FULL, page_verify CHECKSUM; no global trace flags are enabled;
sources
  • quote results@20261007-205106-eshoponweb:targets[sql].durability
mssql.conf of container gvb-mssql (/var/opt/mssql/mssql.conf, on the host at ~/gvb-data/engines/mssql/mssql.conf) does not exist, so it sets: nothing; it has no [control] or [traceflag] entry,
sources
  • quote results@20261007-205106-eshoponweb:targets[sql].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

so SQL Server's own Linux defaults for flushing writes apply (Microsoft's Linux performance guide names trace flag 3982 as that default; read from the guide, not tested here).
sources
  • quote results@20261007-205106-eshoponweb:targets[sql].durability
Not tested by cutting power; whether the disk's own write cache reaches the media was not checked.
sources
  • quote results@20261007-205106-eshoponweb:targets[sql].durability

Read from the running engine or the machine by the benchmark's own code, as the cited line shows:

sources
  • file src/GenericVectorBuilder.Bench/Targets/SqlServerContainer.cs#n.StartsWith( "MSSQL_" = n.StartsWith( "MSSQL_"
Container settings from its environment (names only): MSSQL_AGENT_ENABLED, MSSQL_MEMORY_LIMIT_MB, MSSQL_PID, MSSQL_RPC_PORT, MSSQL_SA_PASSWORD.
sources
  • quote results@20261007-205106-eshoponweb:targets[sql].durability

pgvector: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

fsync on, synchronous_commit on, full_page_writes on, wal_sync_method fdatasync (PostgreSQL defaults;
sources
  • quote results@20261007-205106-eshoponweb:targets[pgvector].durability

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file deploy/engines/pgvector.compose.yaml#shared_buffers=2GB = shared_buffers=2GB
  • file deploy/engines/pgvector.compose.yaml#maintenance_work_mem=1GB = maintenance_work_mem=1GB
  • file deploy/engines/pgvector.compose.yaml#max_wal_size=4GB = max_wal_size=4GB
pgvector.compose.yaml sets only shared_buffers, maintenance_work_mem and max_wal_size):
sources
  • quote results@20261007-205106-eshoponweb:targets[pgvector].durability

Typed in the program's own text; it cites a measurement that these runs did not repeat, and no saved source backs this clause:

no sources recorded

every commit is flushed to the write-ahead log before it returns and HNSW index changes are WAL-logged, so a crash loses no committed row (max_wal_size 4GB only spaces out checkpoints; measured with docker kill, which is SIGKILL, right after a 2,000-vector load and a restart: all 2,000 rows were there and the HNSW index was valid and used by the default search)
sources
  • quote results@20261007-205106-eshoponweb:targets[pgvector].durability

sqlitevec: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Set by a line of code or a compose file saved in this repository; the v8 engine settings also list journal_mode, read from the running engine:

sources
  • file src/GenericVectorBuilder.Engines/Sinks/SqliteVecSink.cs#Run( connection, "PRAGMA journal_mode=WAL;" ) = Run( connection, "PRAGMA journal_mode=WAL;" )
  • file src/GenericVectorBuilder.Engines/Sinks/SqliteVecSink.cs#Run( connection, "PRAGMA synchronous=NORMAL;" ) = Run( connection, "PRAGMA synchronous=NORMAL;" )
  • consolidated consolidated:engineSettings[6].settings[2].key = journal_mode
  • consolidated consolidated:engineSettings[6].settings[2].how = read: PRAGMA journal_mode on a second, read-only connection to the bench file
PRAGMA journal_mode=WAL and PRAGMA synchronous=NORMAL (set by this sink when it opens the file):
sources
  • quote results@20261007-205106-eshoponweb:targets[sqlitevec].durability

Typed in the program's own text; it cites a measurement that these runs did not repeat, and no saved source backs this clause:

no sources recorded

each commit is appended to the -wal file and handed to the operating system, but the WAL is fsynced only when SQLite checkpoints it (measured with strace: 40 single-record commits caused 3 WAL fsyncs), so a crash of the process loses nothing (measured with kill -9 and a reopen: all 50, 300 and 2,000 rows were there), while an operating-system crash or power cut can lose the newest commits since the last checkpoint and leaves the database consistent
sources
  • quote results@20261007-205106-eshoponweb:targets[sqlitevec].durability

qdrant: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Backed by a saved log or measurement, not read back from the engine in these runs:

sources
  • file design/engine-docs/durability-logs-2026-10-04/qdrant-wait-true.strace#MS_SYNC = MS_SYNC
  • file design/engine-docs/durability-logs-2026-10-04/qdrant-wait-true.marks.json#"mode": "true" = "mode": "true"
  • file design/engine-docs/durability-logs-2026-10-04/qdrant-wait-false.strace#msync = msync
  • file design/engine-docs/durability-logs-2026-10-04/qdrant-wait-false.marks.json#"mode": "false" = "mode": "false"
What was measured (strace -f on the Qdrant server process, 30 single-point REST upserts per setting, every sync call timed against the request that caused it): with wait=true each upsert had exactly one msync(MS_SYNC) of the write-ahead-log segment inside the request, before the reply (30 of 30);
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant].durability
with wait=false the 30 upserts were acknowledged within 0.26 s with no sync call, and the first WAL msync (one call covering all 30 records) came 2.7 s after the last reply, followed by the segment-file flushes.
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

So the log is flushed to disk under both settings, but with wait=false the flush comes after the acknowledgement: an operating-system crash or power cut in that gap loses acknowledged writes, while a crash of the Qdrant process alone should not, because the bytes are already in the kernel's page cache (inferred, not tested).
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant].durability

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file src/GenericVectorBuilder.Core/Sinks/QdrantSink.cs#_client.UpsertAsync( name, points, wait: true = _client.UpsertAsync( name, points, wait: true
  • file src/GenericVectorBuilder.Core/Sinks/QdrantSink.cs#private const int UPSERT_BATCH = 256; = private const int UPSERT_BATCH = 256;
Every upsert here is sent with wait=true in batches of 256 over gRPC;
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

the strace used one point per request, so one flush per batch is inferred, not measured.
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant].durability

Read from the running engine or the machine by the benchmark's own code, as the cited line shows:

sources
  • file src/GenericVectorBuilder.Bench/Targets/QdrantServer.cs#ConfigFiles.ReadContainerFileAsync( container, configPath, ct ) = ConfigFiles.ReadContainerFileAsync( container, configPath, ct )
Segment files are flushed every 5 s; log segments 32 MB, 0 created ahead. /qdrant/config/config.yaml in container gvb-qdrant (the image's own file; its storage keys are listed) sets: storage.collection.quantization = null, storage.collection.replication_factor = 1, storage.collection.vectors.on_disk = null, storage.collection.write_consistency_factor = 1, storage.hnsw_index.ef_construct = 100, storage.hnsw_index.full_scan_threshold_kb = 10000, storage.hnsw_index.m = 16, storage.hnsw_index.max_indexing_threads = 0, storage.hnsw_index.on_disk = false, storage.hnsw_index.payload_m = null, storage.max_collections = null, storage.node_type = Normal, storage.on_disk_payload = true, storage.optimizers.default_segment_number = 0, storage.optimizers.deleted_threshold = 0.2, storage.optimizers.flush_interval_sec = 5, storage.optimizers.indexing_threshold_kb = 10000, storage.optimizers.max_optimization_threads = null, storage.optimizers.max_segment_size_kb = null, storage.optimizers.vacuum_min_vector_number = 1000, storage.performance.max_search_threads = 0, storage.performance.optimizer_cpu_budget = 0, storage.performance.update_rate_limit = null, storage.shard_transfer_method = null, storage.snapshots_config.snapshots_storage = local, storage.snapshots_path = ./snapshots, storage.storage_path = ./storage, storage.temp_path = null, storage.update_concurrency = null, storage.wal.wal_capacity_mb = 32, storage.wal.wal_segments_ahead = 0; no QDRANT__ environment overrides in the server process.
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

Not tested by cutting power; whether the disk's own write cache reaches the media was not checked.
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant].durability

opensearch: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

Every acknowledged bulk request is fsynced to the translog before the answer: index.translog.durability=request, the OpenSearch default, which neither this sink nor opensearch.compose.yaml overrides
sources
  • quote results@20261007-205106-eshoponweb:targets[opensearch].durability

Described by a test saved in this repository, which these runs did not run:

sources
  • file tests/GenericVectorBuilder.Engines.Tests/OpenSearchReadinessTests.cs#index.translog.durability = index.translog.durability
(OpenSearchReadinessTests reads it back from the live index).
sources
  • quote results@20261007-205106-eshoponweb:targets[opensearch].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

By that setting a process crash or power loss loses no acknowledged write; this is read from the setting, not shown by pulling power.
sources
  • quote results@20261007-205106-eshoponweb:targets[opensearch].durability

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchSink.cs#["number_of_shards"] = 1, ["number_of_replicas"] = 0 = ["number_of_shards"] = 1, ["number_of_replicas"] = 0
One node and no replicas,
sources
  • quote results@20261007-205106-eshoponweb:targets[opensearch].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

so a lost disk loses the data.
sources
  • quote results@20261007-205106-eshoponweb:targets[opensearch].durability

qdrant-hnsw: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Backed by a saved log or measurement, not read back from the engine in these runs:

sources
  • file design/engine-docs/durability-logs-2026-10-04/qdrant-wait-true.strace#MS_SYNC = MS_SYNC
  • file design/engine-docs/durability-logs-2026-10-04/qdrant-wait-true.marks.json#"mode": "true" = "mode": "true"
  • file design/engine-docs/durability-logs-2026-10-04/qdrant-wait-false.strace#msync = msync
  • file design/engine-docs/durability-logs-2026-10-04/qdrant-wait-false.marks.json#"mode": "false" = "mode": "false"
What was measured (strace -f on the Qdrant server process, 30 single-point REST upserts per setting, every sync call timed against the request that caused it): with wait=true each upsert had exactly one msync(MS_SYNC) of the write-ahead-log segment inside the request, before the reply (30 of 30);
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant-hnsw].durability
with wait=false the 30 upserts were acknowledged within 0.26 s with no sync call, and the first WAL msync (one call covering all 30 records) came 2.7 s after the last reply, followed by the segment-file flushes.
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant-hnsw].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

So the log is flushed to disk under both settings, but with wait=false the flush comes after the acknowledgement: an operating-system crash or power cut in that gap loses acknowledged writes, while a crash of the Qdrant process alone should not, because the bytes are already in the kernel's page cache (inferred, not tested).
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant-hnsw].durability

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file src/GenericVectorBuilder.Core/Sinks/QdrantSink.cs#_client.UpsertAsync( name, points, wait: true = _client.UpsertAsync( name, points, wait: true
  • file src/GenericVectorBuilder.Core/Sinks/QdrantSink.cs#private const int UPSERT_BATCH = 256; = private const int UPSERT_BATCH = 256;
Every upsert here is sent with wait=true in batches of 256 over gRPC;
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant-hnsw].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

the strace used one point per request, so one flush per batch is inferred, not measured.
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant-hnsw].durability

Read from the running engine or the machine by the benchmark's own code, as the cited line shows:

sources
  • file src/GenericVectorBuilder.Bench/Targets/QdrantServer.cs#ConfigFiles.ReadContainerFileAsync( container, configPath, ct ) = ConfigFiles.ReadContainerFileAsync( container, configPath, ct )
Segment files are flushed every 5 s; log segments 32 MB, 0 created ahead. /qdrant/config/config.yaml in container gvb-qdrant (the image's own file; its storage keys are listed) sets: storage.collection.quantization = null, storage.collection.replication_factor = 1, storage.collection.vectors.on_disk = null, storage.collection.write_consistency_factor = 1, storage.hnsw_index.ef_construct = 100, storage.hnsw_index.full_scan_threshold_kb = 10000, storage.hnsw_index.m = 16, storage.hnsw_index.max_indexing_threads = 0, storage.hnsw_index.on_disk = false, storage.hnsw_index.payload_m = null, storage.max_collections = null, storage.node_type = Normal, storage.on_disk_payload = true, storage.optimizers.default_segment_number = 0, storage.optimizers.deleted_threshold = 0.2, storage.optimizers.flush_interval_sec = 5, storage.optimizers.indexing_threshold_kb = 10000, storage.optimizers.max_optimization_threads = null, storage.optimizers.max_segment_size_kb = null, storage.optimizers.vacuum_min_vector_number = 1000, storage.performance.max_search_threads = 0, storage.performance.optimizer_cpu_budget = 0, storage.performance.update_rate_limit = null, storage.shard_transfer_method = null, storage.snapshots_config.snapshots_storage = local, storage.snapshots_path = ./snapshots, storage.storage_path = ./storage, storage.temp_path = null, storage.update_concurrency = null, storage.wal.wal_capacity_mb = 32, storage.wal.wal_segments_ahead = 0; no QDRANT__ environment overrides in the server process.
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant-hnsw].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

Not tested by cutting power; whether the disk's own write cache reaches the media was not checked.
sources
  • quote results@20261007-205106-eshoponweb:targets[qdrant-hnsw].durability

redis: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Set by a line of code or a compose file saved in this repository; the v8 engine settings also list appendonly, read from the running engine:

sources
  • file deploy/engines/redis.compose.yaml#--save "300 1" = --save "300 1"
  • file deploy/engines/redis.compose.yaml#--appendonly no = --appendonly no
  • consolidated consolidated:engineSettings[10].settings[5].key = appendonly
  • consolidated consolidated:engineSettings[10].settings[5].how = read: docker exec gvb-redis redis-cli CONFIG GET appendonly
save "300 1" and appendonly no (redis.compose.yaml):
sources
  • quote results@20261007-205106-eshoponweb:targets[redis].durability

Typed in the program's own text; it cites a measurement that these runs did not repeat, and no saved source backs this clause:

no sources recorded

an RDB snapshot is written every 5 minutes if at least one key changed, and on a clean stop; there is no append-only log, so a crash loses every write since the last snapshot (up to 5 minutes plus the time a snapshot takes; measured with docker kill, which is SIGKILL, right after a 2,000-vector load: none of the 2,000 hashes were there after the restart, and the restart loaded an older snapshot that still held keys of a collection that had been dropped since)
sources
  • quote results@20261007-205106-eshoponweb:targets[redis].durability

milvus: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

Writes are not fsynced. Standalone uses the default message queue rocksmq (RocksDB, /var/lib/milvus/rdb_data, mq.type default) and flushed segments go to local-disk object storage
sources
  • quote results@20261007-205106-eshoponweb:targets[milvus].durability

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file deploy/engines/milvus.compose.yaml#COMMON_STORAGETYPE: local = COMMON_STORAGETYPE: local
(COMMON_STORAGETYPE=local in milvus.compose.yaml).
sources
  • quote results@20261007-205106-eshoponweb:targets[milvus].durability

Backed by a saved log or measurement, not read back from the engine in these runs:

sources
  • file design/engine-docs/durability-logs-2026-10-04/milvus-acknowledged-upserts.strace#member/wal = member/wal
Measured 2026-10-04 with strace over 30 acknowledged single-row upserts and one flush: fdatasync ran only on the embedded etcd files (member/wal, member/snap/db), never on rdb_data or the segment files.
sources
  • quote results@20261007-205106-eshoponweb:targets[milvus].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

A host power loss or kernel crash can lose acknowledged rows that are still in the OS page cache; a Milvus process crash alone should not (inferred, not tested). Metadata in embedded etcd is fdatasynced on every commit.
sources
  • quote results@20261007-205106-eshoponweb:targets[milvus].durability

mariadb: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Backed by a saved log or measurement; the v8 engine settings also list innodb_flush_log_at_trx_commit, read from the running engine:

sources
  • file deploy/engines/mariadb-bench.compose.yaml#--innodb-flush-log-at-trx-commit=2 = --innodb-flush-log-at-trx-commit=2
  • file deploy/engines/mariadb.compose.yaml#--innodb-flush-log-at-trx-commit=2 = --innodb-flush-log-at-trx-commit=2
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#SETTING innodb_flush_log_at_trx_commit = 2 = SETTING innodb_flush_log_at_trx_commit = 2
  • consolidated consolidated:engineSettings[12].settings[4].key = innodb_flush_log_at_trx_commit
  • consolidated consolidated:engineSettings[12].settings[4].how = read: docker exec gvbbench-mariadb mariadb SHOW GLOBAL VARIABLES
innodb_flush_log_at_trx_commit=2 (set in mariadb-bench.compose.yaml for the benchmark's own container gvbbench-mariadb, and in mariadb.compose.yaml for the daily gvb-mariadb, which has the same server settings):
sources
  • quote results@20261007-205106-eshoponweb:targets[mariadb].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

the InnoDB redo log is written to the operating system at every commit but fsynced about once a second, so a crash of the mariadbd process loses nothing, while an operating-system crash or power cut can lose the last second of commits;
sources
  • quote results@20261007-205106-eshoponweb:targets[mariadb].durability

Backed by a saved log or measurement, not read back from the engine in these runs:

sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#SETTING innodb_doublewrite = ON = SETTING innodb_doublewrite = ON
innodb_doublewrite is on
sources
  • quote results@20261007-205106-eshoponweb:targets[mariadb].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

(default),
sources
  • quote results@20261007-205106-eshoponweb:targets[mariadb].durability

Backed by a saved log or measurement, not read back from the engine in these runs:

sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#SETTING log_bin = OFF = SETTING log_bin = OFF
the binary log is off,
sources
  • quote results@20261007-205106-eshoponweb:targets[mariadb].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

and the vector graph is an InnoDB table under the same log
sources
  • quote results@20261007-205106-eshoponweb:targets[mariadb].durability

Backed by a saved log or measurement, not read back from the engine in these runs:

sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#SETTING innodb_flush_log_at_trx_commit = 2 = SETTING innodb_flush_log_at_trx_commit = 2
(settings read from the running server with SHOW VARIABLES;
sources
  • quote results@20261007-205106-eshoponweb:targets[mariadb].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

the crash behaviour is InnoDB's documented behaviour for this setting and was not tested on either container)
sources
  • quote results@20261007-205106-eshoponweb:targets[mariadb].durability

weaviate: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

The recorded weaviate text says 'sets no persistence variable'; deploy/engines/weaviate.compose.yaml sets PERSISTENCE_DATA_PATH. That clause is not printed.

sources
  • file deploy/engines/weaviate.compose.yaml#PERSISTENCE_DATA_PATH: = PERSISTENCE_DATA_PATH:
  • results results@20261007-205106-eshoponweb:targets[weaviate].durability#sets no persistence variable = sets no persistence variable

Typed in the program's own text; it cites a measurement that these runs did not repeat, and no saved source backs this clause:

no sources recorded

every object is appended to the LSM write-ahead log with a plain write and no fsync, and the log is fsynced only when its memtable is flushed, 60 seconds after the last write (PERSISTENCE_MEMTABLES_FLUSH_IDLE_AFTER_SECONDS default; measured with strace: 2,080 writes into the objects log during a 2,000-object load, the first fsync 60 s after the last write), so a power cut can lose the last minute of writes; the HNSW commit log is buffered inside the process (77 writes for 2,000 vectors), so a killed process loses the newest vectors from the vector index while their objects survive (measured with docker kill, which is SIGKILL, one second after the load and a restart, two runs each: 0 to 1 of 50, 264 to 267 of 300 and 1,992 to 1,997 of 2,000 stored objects were still reachable through a vector search)
sources
  • quote results@20261007-205106-eshoponweb:targets[weaviate].durability

mongodb: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

Acknowledged writes are journaled before the acknowledgement. The sink sets no write concern, so the server default applies: getDefaultRWConcern gives w majority and the one-member replica set (--replSet gvbmongo in the image) has writeConcernMajorityJournalDefault true, with WiredTiger journaling on (journalCommitInterval 100 ms is only the interval for unacknowledged work).
sources
  • quote results@20261007-205106-eshoponweb:targets[mongodb].durability

Typed in the program's own text; it cites a measurement that these runs did not repeat, and no saved source backs this clause:

no sources recorded

Measured 2026-10-04: 30 acknowledged single-document inserts raised WiredTiger 'log sync operations' by 30 and
sources
  • quote results@20261007-205106-eshoponweb:targets[mongodb].durability

Backed by a saved log or measurement, not read back from the engine in these runs:

sources
  • file design/engine-docs/durability-logs-2026-10-04/mongodb-acknowledged-inserts.strace#WiredTigerLog = WiredTigerLog
strace showed fdatasync on /data/db/journal/WiredTigerLog files.
sources
  • quote results@20261007-205106-eshoponweb:targets[mongodb].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

A crash loses no acknowledged write. mongot's search index is not part of that promise: it follows the collection asynchronously and is rebuilt from it.
sources
  • quote results@20261007-205106-eshoponweb:targets[mongodb].durability

chroma: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

SQLite rollback journal with its default synchronous=FULL under the data directory
sources
  • quote results@20261007-205106-eshoponweb:targets[chroma].durability

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file deploy/engines/chroma.compose.yaml#IS_PERSISTENT: "1" = IS_PERSISTENT: "1"
  • file deploy/engines/chroma.compose.yaml#PERSIST_DIRECTORY: /data = PERSIST_DIRECTORY: /data
(chroma.compose.yaml sets IS_PERSISTENT=1 and PERSIST_DIRECTORY=/data and no sync setting):
sources
  • quote results@20261007-205106-eshoponweb:targets[chroma].durability

Typed in the program's own text; it cites a measurement that these runs did not repeat, and no saved source backs this clause:

no sources recorded

every write is committed to chroma.sqlite3 with fsync of the journal, the directory and the database file before the call returns (strace: 15 database fsyncs and 38 journal fsyncs for one create, four 500-vector upserts and one delete), and the HNSW files are written every sync_threshold=1000 vectors and rebuilt from the SQLite log after a crash; measured with kill -9 and a restart: all 50, 300 and 2,000 vectors were still stored and searchable
sources
  • quote results@20261007-205106-eshoponweb:targets[chroma].durability

typesense: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Typed in the program's own text; it cites a measurement that these runs did not repeat, and no saved source backs this clause:

no sources recorded

Every acknowledged write is appended to Typesense's raft log and fsynced before the answer: braft raft_sync=true with raft_sync_policy=0 (sync immediately), read from the running container's brpc /flags page on 2026-10-04. A restart replays the log from the last snapshot
sources
  • quote results@20261007-205106-eshoponweb:targets[typesense].durability

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file deploy/engines/typesense.compose.yaml#TYPESENSE_SNAPSHOT_INTERVAL_SECONDS: "300" = TYPESENSE_SNAPSHOT_INTERVAL_SECONDS: "300"
(typesense.compose.yaml sets TYPESENSE_SNAPSHOT_INTERVAL_SECONDS=300)
sources
  • quote results@20261007-205106-eshoponweb:targets[typesense].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

and rebuilds the in-memory HNSW graph, so by those settings a crash loses no acknowledged write, but the restart is slow after a big load. This is read from the settings, not shown by pulling power. One node and no replicas, so a lost disk loses the data.
sources
  • quote results@20261007-205106-eshoponweb:targets[typesense].durability

sql-diskann: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

A commit returns after its transaction-log records are written to disk (SQL Server write-ahead logging;
sources
  • quote results@20261007-205106-eshoponweb:targets[sql-diskann].durability

Read from the running engine or the machine by the benchmark's own code, as the cited line shows:

sources
  • file src/GenericVectorBuilder.Bench/Targets/SqlDurability.cs#SELECT name, recovery_model_desc, delayed_durability_desc, page_verify_option_desc FROM sys.databases = SELECT name, recovery_model_desc, delayed_durability_desc, page_verify_option_desc FROM sys.databases
delayed durability is DISABLED);
sources
  • quote results@20261007-205106-eshoponweb:targets[sql-diskann].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

a database created here copies the model database:
sources
  • quote results@20261007-205106-eshoponweb:targets[sql-diskann].durability

Read from the running engine or the machine by the benchmark's own code, as the cited line shows:

sources
  • file src/GenericVectorBuilder.Bench/Targets/SqlDurability.cs#SELECT name, recovery_model_desc, delayed_durability_desc, page_verify_option_desc FROM sys.databases = SELECT name, recovery_model_desc, delayed_durability_desc, page_verify_option_desc FROM sys.databases
  • file src/GenericVectorBuilder.Bench/Targets/SqlDurability.cs#DBCC TRACESTATUS( -1 ) WITH NO_INFOMSGS; = DBCC TRACESTATUS( -1 ) WITH NO_INFOMSGS;
  • file src/GenericVectorBuilder.Bench/Targets/SqlDurability.cs#ConfigFiles.ExistsWithSudoAsync( confPath, ct ) = ConfigFiles.ExistsWithSudoAsync( confPath, ct )
recovery model FULL, page_verify CHECKSUM; no global trace flags are enabled;
sources
  • quote results@20261007-205106-eshoponweb:targets[sql-diskann].durability
mssql.conf of container gvb-mssql (/var/opt/mssql/mssql.conf, on the host at ~/gvb-data/engines/mssql/mssql.conf) does not exist, so it sets: nothing; it has no [control] or [traceflag] entry,
sources
  • quote results@20261007-205106-eshoponweb:targets[sql-diskann].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

so SQL Server's own Linux defaults for flushing writes apply (Microsoft's Linux performance guide names trace flag 3982 as that default; read from the guide, not tested here).
sources
  • quote results@20261007-205106-eshoponweb:targets[sql-diskann].durability
Not tested by cutting power; whether the disk's own write cache reaches the media was not checked.
sources
  • quote results@20261007-205106-eshoponweb:targets[sql-diskann].durability

Read from the running engine or the machine by the benchmark's own code, as the cited line shows:

sources
  • file src/GenericVectorBuilder.Bench/Targets/SqlServerContainer.cs#n.StartsWith( "MSSQL_" = n.StartsWith( "MSSQL_"
Container settings from its environment (names only): MSSQL_AGENT_ENABLED, MSSQL_MEMORY_LIMIT_MB, MSSQL_PID, MSSQL_RPC_PORT, MSSQL_SA_PASSWORD.
sources
  • quote results@20261007-205106-eshoponweb:targets[sql-diskann].durability

duckdb: its recorded durability text, clause by clause, with how each clause is backed.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

DuckDB's write-ahead log is fsynced at every commit and no DuckDbSink setting changes that
sources
  • quote results@20261007-205106-eshoponweb:targets[duckdb].durability

Set by a line of code or a compose file saved in this repository; the v8 engine settings also list checkpoint_threshold, read from the running engine:

sources
  • file src/GenericVectorBuilder.Engines/Sinks/DuckDbSinkOptions.cs#CheckpointThreshold { get; set; } = "256MB" = CheckpointThreshold { get; set; } = "256MB"
  • file src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs#SET checkpoint_threshold = SET checkpoint_threshold
  • consolidated consolidated:engineSettings[18].settings[5].key = checkpoint_threshold
  • consolidated consolidated:engineSettings[18].settings[5].how = read: SELECT current_setting('checkpoint_threshold') on a second connection to the bench file opened with the sink's own connection string
(checkpoint_threshold=256MB
sources
  • quote results@20261007-205106-eshoponweb:targets[duckdb].durability

Typed in the program's own text; it cites a measurement that these runs did not repeat, and no saved source backs this clause:

no sources recorded

only spaces out the checkpoints that write the database file; measured with strace: 42 WAL fsyncs for 40 single-record commits plus 2 setup statements), so an operating-system crash or power cut loses no committed row; measured with kill -9 right after the last commit and a reopen: all 50, 300 and 2,000 rows and an HNSW index that counted the same number were recovered from the log; not tested and documented by DuckDB: the HNSW index is file-backed only through hnsw_enable_experimental_persistence = true,
sources
  • quote results@20261007-205106-eshoponweb:targets[duckdb].durability

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs#SET hnsw_enable_experimental_persistence = true; = SET hnsw_enable_experimental_persistence = true;
which this sink turns on,
sources
  • quote results@20261007-205106-eshoponweb:targets[duckdb].durability

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

and WAL recovery for such custom indexes is not complete, so a crash during a checkpoint or a later commit can damage the index while the rows survive
sources
  • quote results@20261007-205106-eshoponweb:targets[duckdb].durability

The engine settings table lists what run 20261007-205106-eshoponweb read from each running engine or set from a repository file, as each row's how column says.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

qdrant's measured search fact says: no index used, exact scan by design.

sources
  • results results:targets[qdrant].indexState.afterLoad.detail#no index used, exact scan by design = no index used, exact scan by design

oracle's recorded index text says: Oracle Free caps itself at 2 CPUs.

sources
  • results results:targets[oracle].index#Oracle Free caps itself at 2 CPUs = Oracle Free caps itself at 2 CPUs

elasticsearch's measured search fact says: no HNSW graph, searches scan all 524 vectors.

sources
  • results results:targets[elasticsearch].load.indexNote#NO HNSW GRAPH, searches scan all 524 vectors = NO HNSW GRAPH, searches scan all 524 vectors

sqlitevec's measured search fact says: no index, exact scan by design.

sources
  • results results:targets[sqlitevec].indexState.afterLoad.detail#no index, exact scan by design = no index, exact scan by design

sql's measured search fact says: no index used, exact scan by design.

sources
  • results results:targets[sql].indexState.afterLoad.detail#no index used, exact scan by design = no index used, exact scan by design

mongodb's search fact is the engine's own report; its segments held at most 278 vectors, below the 1,043 at which elasticsearch's recorded text says a segment gets a graph, and no graph was checked.

sources
  • results results:targets[mongodb].load.indexNote#searched through the HNSW graph (Approximate) = searched through the HNSW graph (Approximate)
  • results results@20261006-142724-eshoponweb:targets[mongodb].load.indexNote#278 = 278
  • results results:targets[elasticsearch].index#under 1,043 vectors gets no graph = under 1,043 vectors gets no graph

Run 20261006-130619-eshoponweb: clickhouse's whole engine data folder was recorded as 4.21 GiB, against 99.17 KiB before; the run's page prints a correction to its recorded "added by this load" figure.

sources
  • file deploy/bench/run-page-notes.json#results@20261006-130619-eshoponweb:targets[clickhouse].disk.text = results@20261006-130619-eshoponweb:targets[clickhouse].disk.text
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-130619-eshoponweb].folder = 20261006-130619-eshoponweb
  • results results@20261006-130619-eshoponweb:targets[clickhouse].disk.text#4.21 GiB (whole engine data folder), 99.17 KiB before = 4.21 GiB (whole engine data folder), 99.17 KiB before

Run 20261006-142724-eshoponweb: clickhouse's whole engine data folder was recorded as 6.79 GiB, against 4.22 GiB before; the run's page prints a correction to its recorded "added by this load" figure.

sources
  • file deploy/bench/run-page-notes.json#results@20261006-142724-eshoponweb:targets[clickhouse].disk.text = results@20261006-142724-eshoponweb:targets[clickhouse].disk.text
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-142724-eshoponweb].folder = 20261006-142724-eshoponweb
  • results results@20261006-142724-eshoponweb:targets[clickhouse].disk.text#6.79 GiB (whole engine data folder), 4.22 GiB before = 6.79 GiB (whole engine data folder), 4.22 GiB before

Run 20261006-154837-eshoponweb: clickhouse's whole engine data folder was recorded as 6.79 GiB, against 6.79 GiB before; the run's page prints a correction to its recorded "added by this load" figure.

sources
  • file deploy/bench/run-page-notes.json#results@20261006-154837-eshoponweb:targets[clickhouse].disk.text = results@20261006-154837-eshoponweb:targets[clickhouse].disk.text
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-154837-eshoponweb].folder = 20261006-154837-eshoponweb
  • results results@20261006-154837-eshoponweb:targets[clickhouse].disk.text#6.79 GiB (whole engine data folder), 6.79 GiB before = 6.79 GiB (whole engine data folder), 6.79 GiB before

Run 20261007-205106-eshoponweb: clickhouse's data folder held 4559215474 bytes at its start, 14691380 bytes after its system log tables were truncated and it stopped changing, and 5699801237 bytes at its end.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb
  • results results@20261007-205106-eshoponweb:targets[clickhouse].dataFolder.bytesAtStart = 4559215474
  • results results@20261007-205106-eshoponweb:targets[clickhouse].dataFolder.bytesAfterReset = 14691380
  • results results@20261007-205106-eshoponweb:targets[clickhouse].dataFolder.bytesAtEnd = 5699801237
  • results results@20261007-205106-eshoponweb:targets[clickhouse].dataFolder.reset#the folder was steady = the folder was steady

Run 20261007-205106-eshoponweb: the reset truncated 9 MergeTree log tables, whose active bytes by clickhouse's own count were 2.09 GiB before and 0 B after.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb
  • results results@20261007-205106-eshoponweb:targets[clickhouse].dataFolder.reset#truncated 9 MergeTree log tables in database system = truncated 9 MergeTree log tables in database system
  • results results@20261007-205106-eshoponweb:targets[clickhouse].dataFolder.reset#2.09 GiB = 2.09 GiB
  • results results@20261007-205106-eshoponweb:targets[clickhouse].dataFolder.reset#0 B = 0 B

Run 20261007-221429-eshoponweb: clickhouse's data folder held 5707585756 bytes at its start, 2917655627 bytes after its system log tables were truncated and it stopped changing, and 7408848771 bytes at its end.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-221429-eshoponweb].folder = 20261007-221429-eshoponweb
  • results results@20261007-221429-eshoponweb:targets[clickhouse].dataFolder.bytesAtStart = 5707585756
  • results results@20261007-221429-eshoponweb:targets[clickhouse].dataFolder.bytesAfterReset = 2917655627
  • results results@20261007-221429-eshoponweb:targets[clickhouse].dataFolder.bytesAtEnd = 7408848771
  • results results@20261007-221429-eshoponweb:targets[clickhouse].dataFolder.reset#the folder was steady = the folder was steady

Run 20261007-221429-eshoponweb: the reset truncated 9 MergeTree log tables, whose active bytes by clickhouse's own count were 183.97 KiB before and 0 B after.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-221429-eshoponweb].folder = 20261007-221429-eshoponweb
  • results results@20261007-221429-eshoponweb:targets[clickhouse].dataFolder.reset#truncated 9 MergeTree log tables in database system = truncated 9 MergeTree log tables in database system
  • results results@20261007-221429-eshoponweb:targets[clickhouse].dataFolder.reset#183.97 KiB = 183.97 KiB
  • results results@20261007-221429-eshoponweb:targets[clickhouse].dataFolder.reset#0 B = 0 B

Run 20261007-233551-eshoponweb: clickhouse's data folder held 7426117183 bytes at its start, 2246745378 bytes after its system log tables were truncated and it stopped changing, and 7261702692 bytes at its end.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-233551-eshoponweb].folder = 20261007-233551-eshoponweb
  • results results@20261007-233551-eshoponweb:targets[clickhouse].dataFolder.bytesAtStart = 7426117183
  • results results@20261007-233551-eshoponweb:targets[clickhouse].dataFolder.bytesAfterReset = 2246745378
  • results results@20261007-233551-eshoponweb:targets[clickhouse].dataFolder.bytesAtEnd = 7261702692
  • results results@20261007-233551-eshoponweb:targets[clickhouse].dataFolder.reset#the folder was steady = the folder was steady

Run 20261007-233551-eshoponweb: the reset truncated 9 MergeTree log tables, whose active bytes by clickhouse's own count were 185.06 KiB before and 0 B after.

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-233551-eshoponweb].folder = 20261007-233551-eshoponweb
  • results results@20261007-233551-eshoponweb:targets[clickhouse].dataFolder.reset#truncated 9 MergeTree log tables in database system = truncated 9 MergeTree log tables in database system
  • results results@20261007-233551-eshoponweb:targets[clickhouse].dataFolder.reset#185.06 KiB = 185.06 KiB
  • results results@20261007-233551-eshoponweb:targets[clickhouse].dataFolder.reset#0 B = 0 B

Segment layouts differed between runs for mongodb; each run's layout is in its row flags.

no sources recorded

An observer process ran beside the v8 runs; its own CPU, at most 0.138 CPUs in any one pass, counts as outside load, and its summary is observer/summary.json beside this report.

sources
  • consolidated consolidated:observer.cpuMax = 0.138
  • consolidated consolidated:observer.copy = observer/summary.json

By APERF and MPERF, the largest deviation of one CPU in a pass was 0.66%: oracle's eight-searcher pass on CPU 7, at 3477.0 MHz against the pin of 3500 MHz.

sources
  • consolidated consolidated:observer.cpuWorst.deviationBp|bp-pct = 0.66
  • consolidated consolidated:observer.cpuWorst.target = oracle
  • consolidated consolidated:observer.cpuWorst.cpu = 7
  • consolidated consolidated:observer.cpuWorst.mhz = 3477.0
  • consolidated consolidated:observer.pinnedMhz = 3500

The observer read MSR 0x620 as 0x1e1e.

sources
  • file src/GenericVectorBuilder.Bench/Running/MachineControlSampler.cs#LIMIT_MSR = "0x620" = LIMIT_MSR = "0x620"
  • consolidated consolidated:observer.msr620ValuesSeen[0] = 0x1e1e

oracle's eight-searcher pass ran 0.27% to 0.66% under the pin on every CPU in all 3 runs of v8; no other pass was more than 0.04% from it, and why is not known.

sources
  • consolidated consolidated:observer.dip.target = oracle
  • consolidated consolidated:observer.dip.runs = 3
  • consolidated consolidated:observer.dip.maxBp|bp-pct = 0.66
  • consolidated consolidated:observer.dip.otherWorstBp|bp-pct = 0.04
  • consolidated consolidated:observer.session = v8
  • consolidated consolidated:observer.dip.minBp|bp-pct = 0.27

Run 20261007-205106-eshoponweb: oracle's eight-searcher pass averaged 3085.5 MHz on the engine CPUs and 3189.8 MHz on the client CPUs, as in v7; a mean rule flags it and the median rule does not.

sources
  • consolidated consolidated:observer.meanDips[0].run = 20261007-205106-eshoponweb
  • consolidated consolidated:observer.meanDips[0].engineMeanMhz = 3085.5
  • consolidated consolidated:observer.meanDips[0].clientMeanMhz = 3189.8
  • consolidated consolidated:sessions[name=v7].name = v7

Run 20261007-221429-eshoponweb: oracle's eight-searcher pass averaged 3206.2 MHz on the engine CPUs and 3299.0 MHz on the client CPUs, as in v7; a mean rule flags it and the median rule does not.

sources
  • consolidated consolidated:observer.meanDips[1].run = 20261007-221429-eshoponweb
  • consolidated consolidated:observer.meanDips[1].engineMeanMhz = 3206.2
  • consolidated consolidated:observer.meanDips[1].clientMeanMhz = 3299.0
  • consolidated consolidated:sessions[name=v7].name = v7

Run 20261007-233551-eshoponweb: oracle's eight-searcher pass averaged 3063.0 MHz on the engine CPUs and 3189.2 MHz on the client CPUs, as in v7; a mean rule flags it and the median rule does not.

sources
  • consolidated consolidated:observer.meanDips[2].run = 20261007-233551-eshoponweb
  • consolidated consolidated:observer.meanDips[2].engineMeanMhz = 3063.0
  • consolidated consolidated:observer.meanDips[2].clientMeanMhz = 3189.2
  • consolidated consolidated:sessions[name=v7].name = v7

The observer was not pinned: in the v8 runs 34.8, 33.8 and 33.5 percent of its resident-thread ticks were seen on engine CPUs 2-3,6-7.

sources
  • consolidated consolidated:observer.session = v8
  • doc doc:design/bench-inputs/observer-placement/analysis-801.txt#The observer is NOT pinned = The observer is NOT pinned
  • doc doc:design/bench-inputs/observer-placement/analysis-801.txt#11880 ticks (34.8 percent) on engine CPUs 2-3,6-7 = 11880 ticks (34.8 percent) on engine CPUs 2-3,6-7
  • doc doc:design/bench-inputs/observer-placement/analysis-802.txt#11167 ticks (33.8 percent) on engine CPUs 2-3,6-7 = 11167 ticks (33.8 percent) on engine CPUs 2-3,6-7
  • doc doc:design/bench-inputs/observer-placement/analysis-803.txt#11135 ticks (33.5 percent) on engine CPUs 2-3,6-7 = 11135 ticks (33.5 percent) on engine CPUs 2-3,6-7

Averaged over a whole run, the observer's CPU by cgroup was at most 0.0755 CPUs in any of the v8 runs.

sources
  • consolidated consolidated:observer.session = v8
  • doc doc:design/bench-inputs/observer-placement/analysis-801.txt#children included): 0.0755 CPUs = children included): 0.0755 CPUs
  • doc doc:design/bench-inputs/observer-placement/analysis-802.txt#children included): 0.0753 CPUs = children included): 0.0753 CPUs
  • doc doc:design/bench-inputs/observer-placement/analysis-803.txt#children included): 0.0755 CPUs = children included): 0.0755 CPUs

The observer saw a systemd timer fire during 14 timed passes of the v8 runs.

sources
  • consolidated consolidated:observer.passesWithTimerFired = 14

An observer process ran beside the v7 runs; its own CPU, at most 0.123 CPUs in any one pass, counts as outside load, and its summary is observer/summary-v7.json beside this report.

sources
  • consolidated consolidated:observerOthers[0].cpuMax = 0.123
  • consolidated consolidated:observerOthers[0].copy = observer/summary-v7.json

By APERF and MPERF, the largest deviation of one CPU in a pass was 0.73%: oracle's eight-searcher pass on CPU 2, at 3474.3 MHz against the pin of 3500 MHz.

sources
  • consolidated consolidated:observerOthers[0].cpuWorst.deviationBp|bp-pct = 0.73
  • consolidated consolidated:observerOthers[0].cpuWorst.target = oracle
  • consolidated consolidated:observerOthers[0].cpuWorst.cpu = 2
  • consolidated consolidated:observerOthers[0].cpuWorst.mhz = 3474.3
  • consolidated consolidated:observerOthers[0].pinnedMhz = 3500

The observer read MSR 0x620 as 0x1e1e.

sources
  • file src/GenericVectorBuilder.Bench/Running/MachineControlSampler.cs#LIMIT_MSR = "0x620" = LIMIT_MSR = "0x620"
  • consolidated consolidated:observerOthers[0].msr620ValuesSeen[0] = 0x1e1e

oracle's eight-searcher pass ran 0.41% to 0.73% under the pin on every CPU in all 3 runs of v7; no other pass was more than 0.05% from it, and why is not known.

sources
  • consolidated consolidated:observerOthers[0].dip.target = oracle
  • consolidated consolidated:observerOthers[0].dip.runs = 3
  • consolidated consolidated:observerOthers[0].dip.maxBp|bp-pct = 0.73
  • consolidated consolidated:observerOthers[0].dip.otherWorstBp|bp-pct = 0.05
  • consolidated consolidated:observerOthers[0].session = v7
  • consolidated consolidated:observerOthers[0].dip.minBp|bp-pct = 0.41

The observer summary covers systemd timers for no v7 run.

sources
  • consolidated consolidated:observerOthers[0].runs[0].timersCovered = false
  • consolidated consolidated:observerOthers[0].runs[1].timersCovered = false
  • consolidated consolidated:observerOthers[0].runs[2].timersCovered = false

CPU idle states were recorded and left as found: driver intel_idle, governor menu.

sources
  • results results:conditions.cpuIdle.driver = intel_idle
  • results results:conditions.cpuIdle.governor = menu

Outside load is busy CPU less this client's and the followed engine cgroups'; dockerd's cgroup is one of them for a compose engine, so its CPU counts as benchmark work, not outside load.

sources
  • file src/GenericVectorBuilder.Bench/Running/MachineControlPinning.cs#AddGroup( dockerd ); = AddGroup( dockerd );
  • file src/GenericVectorBuilder.Bench/Running/MachineControlSampler.cs#double outside = ( reading.Busy - _last.Busy ) - ( reading.Self - _last.Self ) - engine; = double outside = ( reading.Busy - _last.Busy ) - ( reading.Self - _last.Self ) - engine;

The runs of v7 did not record how dockerd's CPU was counted.

no sources recorded

engine CPU per search is the CPU time (cpu.stat usage_usec) of the cgroups each target's turn followed (conditions.engines[].cgroups, dockerd's left out), read with every 250 ms sample, interpolated to the pass's timed window and divided by its completed searches; engineCpusBusy is that CPU time over the window's length. A followed cgroup counts every process in it. dockerd's cgroup (/sys/fs/cgroup/system.slice/docker.service, holding docker-proxy, dockerd, for every container on the box) is left out of engine CPU per search and given as dockerdCpuMsPerSearch; it is subtracted from outside load as benchmark work during the turns of oracle, mongodb, redis, typesense, clickhouse, sql, opensearch, milvus, sql-diskann, qdrant-hnsw, weaviate, pgvector, vespa, elasticsearch, mariadb, chroma, qdrant, and counts as outside load during the turns of duckdb, sqlitevec. containerd-shim runs in /sys/fs/cgroup/system.slice/containerd.service, which is in neither engine figure and counts as outside load. An embedded engine runs in this client process, so its CPU is in clientCpuMsPerSearch and its engine figure is null with the reason; a target whose engine has no cgroup followed, or whose containers could not all be pinned, also gets null with the reason, never 0.
sources
  • quote results@20261007-205106-eshoponweb:conditions.engineCpu.rule

The test OutsideLoad_IsTheV7AccountingBitForBit holds the formula that turns CPU counters into outside load equal to the formula of v7, on fixed counters; it does not make the measured load of two sessions equal.

sources
  • file tests/GenericVectorBuilder.Engines.Tests/Bench/MachineControlV8Tests.cs#OutsideLoad_IsTheV7AccountingBitForBit = OutsideLoad_IsTheV7AccountingBitForBit

Every order here was measured at the search settings each run recorded for the engine, listed in the why section; this report makes no claim at other settings.

no sources recorded

A route each run recorded in conditions.connections reads: container address on its Docker network, not the published port (no docker-proxy).

sources
  • results results:conditions.connections#container address on its Docker network, not the published port (no docker-proxy) = container address on its Docker network, not the published port (no docker-proxy)

A route each run recorded in conditions.connections reads: in this process (embedded), no network.

sources
  • results results:conditions.connections#in this process (embedded), no network = in this process (embedded), no network

Text as the tool recorded it. Its figures were not re-derived for this report.

Dropped clock warnings
runtextenginepassengine median MHzclient median MHz
20261006-130619-eshoponwebWARNING: clock off its pinned value during oracle default@8: the engine CPUs averaged 3121 MHz, -10.8% against the pinned 3500 MHz; the client CPUs averaged 3141 MHz, -10.3% against the pinned 3500 MHz (limit 1%); this pass is not comparable with passes at the pinned clock.oracledefault@834923492
20261006-142724-eshoponwebWARNING: clock off its pinned value during oracle default@8: the engine CPUs averaged 3129 MHz, -10.6% against the pinned 3500 MHz; the client CPUs averaged 3230 MHz, -7.7% against the pinned 3500 MHz (limit 1%); this pass is not comparable with passes at the pinned clock.oracledefault@834923492
20261006-154837-eshoponwebWARNING: clock off its pinned value during oracle default@8: the engine CPUs averaged 3168 MHz, -9.5% against the pinned 3500 MHz; the client CPUs averaged 3214 MHz, -8.2% against the pinned 3500 MHz (limit 1%); this pass is not comparable with passes at the pinned clock.oracledefault@834923492
Container images
EngineImage referenceImage idTag last set (UTC)Before the first start
clickhouseclickhouse/clickhouse-server:26.3.39.73a91276f06692026-10-03T14:12:01.743437616Zyes
vespavespaengine/vespa:8.754.145c30f5c41e752026-10-03T14:13:52.169232039Zyes
oraclegvenzl/oracle-free:23-slim-faststartf5ff190338602026-10-03T14:17:05.132133694Zyes
elasticsearchelasticsearch:9.5.3e23d4758358a2026-10-03T14:07:11.337389556Zyes
sqlmcr.microsoft.com/mssql/server:2025-CU9-ubuntu-24.04@sha256:2b5b581621126574f3d1f75e78d3eebe8d05aedb59ad0cfdf9aa42cb0634d7262b5b581621122026-10-04T22:02:11.293843649Zyes
pgvectorpgvector/pgvector:0.8.7-pg17-trixie7a7e9f22015b2026-10-03T14:04:52.665253039Zyes
qdrantqdrant/qdrant:v1.17.0@sha256:f1c7272cdac52b38c1a0e89313922d940ba50afd90d593a1605dbbc214e66ffbf1c7272cdac52026-10-04T22:03:16.973657523Zyes
opensearchopensearchproject/opensearch:3.9.0adfa61f850252026-10-03T14:09:29.512875356Zyes
qdrant-hnswqdrant/qdrant:v1.17.0@sha256:f1c7272cdac52b38c1a0e89313922d940ba50afd90d593a1605dbbc214e66ffbf1c7272cdac52026-10-04T22:03:16.973657523Zyes
redisredis:8.10.26f81e8915c602026-10-03T14:09:34.185138197Zyes
milvusmilvusdb/milvus:v2.6.2529f7668e64df2026-10-03T14:05:28.412151323Zyes
mariadbmariadb:11.8.96422478cb8e12026-10-03T14:10:11.675870329Zyes
weaviatesemitechnologies/weaviate:1.39.8f6f4a5961f992026-10-03T14:05:40.948499656Zyes
mongodbmongodb/mongodb-atlas-local:8.0.321985314b0ded2026-10-03T14:11:20.531944474Zyes
chromachromadb/chroma:latest1e0b73a187a22026-10-03T14:09:56.392230738Zyes
typesensetypesense/typesense:30.2610f2d34b1f92026-10-03T14:12:37.929033132Zyes
sql-diskannmcr.microsoft.com/mssql/server:2025-CU9-ubuntu-24.04@sha256:2b5b581621126574f3d1f75e78d3eebe8d05aedb59ad0cfdf9aa42cb0634d7262b5b581621122026-10-04T22:02:11.293843649Zyes
Engine settings as recorded
EngineSessionSettingValueHow it was read or set
clickhousev8HostConfig.Memory8589934592read: docker inspect HostConfig.Memory (0 = no limit)
clickhousev8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
clickhousev8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
clickhousev8max_threads\'auto(4)\'read: ClickHouse system.settings, name max_threads, over HTTP
vespav8HostConfig.Memory6442450944read: docker inspect HostConfig.Memory (0 = no limit)
vespav8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
vespav8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
oraclev8HostConfig.Memory6442450944read: docker inspect HostConfig.Memory (0 = no limit)
oraclev8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
oraclev8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
oraclev8cpu_count2read: docker exec gvb-oracle sqlplus / as sysdba, V$PARAMETER and V$INSTANCE at the instance
oraclev8sga_target1610612736read: docker exec gvb-oracle sqlplus / as sysdba, V$PARAMETER and V$INSTANCE at the instance
oraclev8oracle_version23.26.3.0.0read: docker exec gvb-oracle sqlplus / as sysdba, V$PARAMETER and V$INSTANCE at the instance
elasticsearchv8HostConfig.Memory6442450944read: docker inspect HostConfig.Memory (0 = no limit)
elasticsearchv8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
elasticsearchv8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
elasticsearchv8heap_init_in_bytes2147483648read: GET /_nodes/jvm (nodes.<id>.jvm.mem.heap_init_in_bytes and heap_max_in_bytes)
elasticsearchv8heap_max_in_bytes2147483648read: GET /_nodes/jvm (nodes.<id>.jvm.mem.heap_init_in_bytes and heap_max_in_bytes)
sqlv8HostConfig.Memory8589934592read: docker inspect HostConfig.Memory (0 = no limit)
sqlv8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
sqlv8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
pgvectorv8HostConfig.Memory8589934592read: docker inspect HostConfig.Memory (0 = no limit)
pgvectorv8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
pgvectorv8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
pgvectorv8shared_buffers2GBread: docker exec gvb-pgvector psql current_setting
pgvectorv8enable_seqscanoffset: src/GenericVectorBuilder.Engines/Sinks/PgVectorSink.cs#SET LOCAL enable_seqscan = off; SET LOCAL jit = off;
pgvectorv8jitoffset: src/GenericVectorBuilder.Engines/Sinks/PgVectorSink.cs#SET LOCAL enable_seqscan = off; SET LOCAL jit = off;
sqlitevecv8sqlite_version3.53.3read: SELECT sqlite_version() on an in-memory SQLite connection
sqlitevecv8synchronousNORMALset: src/GenericVectorBuilder.Engines/Sinks/SqliteVecSink.cs#PRAGMA synchronous=NORMAL
sqlitevecv8journal_modewalread: PRAGMA journal_mode on a second, read-only connection to the bench file
qdrantv8HostConfig.Memory8589934592read: docker inspect HostConfig.Memory (0 = no limit)
qdrantv8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
qdrantv8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
qdrantv8search_threads3read: threads named search-* of the qdrant process in container gvb-qdrant (/proc)
opensearchv8HostConfig.Memory6442450944read: docker inspect HostConfig.Memory (0 = no limit)
opensearchv8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
opensearchv8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
opensearchv8heap_init_in_bytes2147483648read: GET /_nodes/jvm (nodes.<id>.jvm.mem.heap_init_in_bytes and heap_max_in_bytes)
opensearchv8heap_max_in_bytes2147483648read: GET /_nodes/jvm (nodes.<id>.jvm.mem.heap_init_in_bytes and heap_max_in_bytes)
qdrant-hnswv8HostConfig.Memory8589934592read: docker inspect HostConfig.Memory (0 = no limit)
qdrant-hnswv8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
qdrant-hnswv8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
qdrant-hnswv8search_threads3read: threads named search-* of the qdrant process in container gvb-qdrant (/proc)
redisv8HostConfig.Memory12884901888read: docker inspect HostConfig.Memory (0 = no limit)
redisv8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
redisv8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
redisv8search-workers8read: docker exec gvb-redis redis-cli CONFIG GET search-workers
redisv8save300 1read: docker exec gvb-redis redis-cli CONFIG GET save
redisv8appendonlynoread: docker exec gvb-redis redis-cli CONFIG GET appendonly
redisv8maxmemory0read: docker exec gvb-redis redis-cli CONFIG GET maxmemory
milvusv8HostConfig.Memory8589934592read: docker inspect HostConfig.Memory (0 = no limit)
milvusv8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
milvusv8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
mariadbv8HostConfig.Memory8589934592read: docker inspect HostConfig.Memory (0 = no limit)
mariadbv8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
mariadbv8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
mariadbv8innodb_buffer_pool_size2147483648read: docker exec gvbbench-mariadb mariadb SHOW GLOBAL VARIABLES
mariadbv8innodb_flush_log_at_trx_commit2read: docker exec gvbbench-mariadb mariadb SHOW GLOBAL VARIABLES
mariadbv8mhnsw_max_cache_size4294967296read: docker exec gvbbench-mariadb mariadb SHOW GLOBAL VARIABLES
weaviatev8HostConfig.Memory8589934592read: docker inspect HostConfig.Memory (0 = no limit)
weaviatev8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
weaviatev8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
weaviatev8GOMEMLIMIT6GiBread: docker inspect Config.Env, the name GOMEMLIMIT only
mongodbv8HostConfig.Memory8589934592read: docker inspect HostConfig.Memory (0 = no limit)
mongodbv8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
mongodbv8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
chromav8HostConfig.Memory6442450944read: docker inspect HostConfig.Memory (0 = no limit)
chromav8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
chromav8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
chromav8chroma_version (API version reported)1.0.0read: GET /api/v2/version
typesensev8HostConfig.Memory6442450944read: docker inspect HostConfig.Memory (0 = no limit)
typesensev8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
typesensev8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
sql-diskannv8HostConfig.Memory8589934592read: docker inspect HostConfig.Memory (0 = no limit)
sql-diskannv8HostConfig.CpusetCpus2-3,6-7read: docker inspect HostConfig.CpusetCpus (empty = every CPU)
sql-diskannv8HostConfig.NanoCpus0read: docker inspect HostConfig.NanoCpus (0 = no limit)
duckdbv8duckdb_versionv1.5.6read: SELECT version() on an in-memory DuckDB connection
duckdbv8threads8read: SELECT current_setting('threads') on an in-memory DuckDB connection; DuckDB's own thread count, not a CPU cap (it counts all CPUs and ignores affinity)
duckdbv8hnsw_ef_search100set: src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs#SET hnsw_ef_search
duckdbv8hnsw_enable_experimental_persistencetrueset: src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs#SET hnsw_enable_experimental_persistence = true
duckdbv8memory_limit7.4 GiBread: SELECT current_setting('memory_limit') on a second connection to the bench file opened with the sink's own connection string
duckdbv8checkpoint_threshold244.1 MiBread: SELECT current_setting('checkpoint_threshold') on a second connection to the bench file opened with the sink's own connection string
Corrections printed on the run pages, count: 71

Each recorded statement below is false, misleading or unbacked, as the correction says. The page of the run it was recorded in marks it and prints this correction with its sources.

RunEngineFieldKindRecorded statementCorrection
20261005-023459-eshoponwebweaviatedurabilityfalseweaviate.compose.yaml sets no persistence variabledeploy/engines/weaviate.compose.yaml sets PERSISTENCE_DATA_PATH to /var/lib/weaviate. The compose file does set a persistence variable.
sources
  • file deploy/engines/weaviate.compose.yaml#PERSISTENCE_DATA_PATH: /var/lib/weaviate = PERSISTENCE_DATA_PATH: /var/lib/weaviate
  • results results@20261005-023459-eshoponweb:targets[weaviate].durability#sets no persistence variable = sets no persistence variable
20261005-023459-eshoponwebclickhousedisk.textmisleading1.27 GiB added by this loadThe figure is the growth of the whole data folder over the engine's turn, as the same line says (2.63 GiB at the end, 1.36 GiB before). The load itself is 524 vectors of 1024 dimensions, 2,146,304 bytes as 4-byte floats (2.05 MiB); the figure is 1,362,545,922 bytes.
sources
  • results results@20261005-023459-eshoponweb:targets[clickhouse].disk.text = 1.27 GiB added by this load (2.63 GiB (whole engine data folder), 1.36 GiB before)
  • results results@20261005-023459-eshoponweb:rows = 524
  • results results@20261005-023459-eshoponweb:dimension = 1024
20261005-023459-eshoponweb-framing linefalseMeasured end to end through each engine's .NET clientThe statement is false for 8 of the 19 engines of this run: chroma, clickhouse, elasticsearch, milvus, opensearch, typesense, vespa and weaviate are reached through the benchmark's own HttpClient REST code, not through a .NET client of the engine. For those engines the figure is the cost of the benchmark's own request code. A code line of each is cited.
sources
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/" = new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ) = _data = new HttpClient( handler )
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
20261005-023459-eshoponweb-indexunbackedan earlier run gave about 0.09 at 100,000No log was saved for this figure, and the summary does not print the clause. A saved re-run of the MariaDB effort test (10 repeats, 524 and 2,000 random 1024-dimension vectors) read recall@10 at ef 100 of 0.988 to 0.996 at 524 vectors and 0.894 to 0.932 at 2,000. The 100,000-row figure was not re-measured the same way and is dropped.
sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#for which no log was saved = for which no log was saved
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#The 100,000-row figure was not re-measured the same way, so the report drops it. = The 100,000-row figure was not re-measured the same way, so the report drops it.
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992
  • file deploy/bench/recorded-text-classes.json#"drop": "mariadb-recall" = "drop": "mariadb-recall"
20261005-031556-eshoponwebweaviatedurabilityfalseweaviate.compose.yaml sets no persistence variabledeploy/engines/weaviate.compose.yaml sets PERSISTENCE_DATA_PATH to /var/lib/weaviate. The compose file does set a persistence variable.
sources
  • file deploy/engines/weaviate.compose.yaml#PERSISTENCE_DATA_PATH: /var/lib/weaviate = PERSISTENCE_DATA_PATH: /var/lib/weaviate
  • results results@20261005-031556-eshoponweb:targets[weaviate].durability#sets no persistence variable = sets no persistence variable
20261005-031556-eshoponwebclickhousedisk.textmisleading906.61 MiB added by this loadThe figure is the growth of the whole data folder over the engine's turn, as the same line says (3.52 GiB at the end, 2.64 GiB before). The load itself is 524 vectors of 1024 dimensions, 2,146,304 bytes as 4-byte floats (2.05 MiB); the figure is 950,649,750 bytes.
sources
  • results results@20261005-031556-eshoponweb:targets[clickhouse].disk.text = 906.61 MiB added by this load (3.52 GiB (whole engine data folder), 2.64 GiB before)
  • results results@20261005-031556-eshoponweb:rows = 524
  • results results@20261005-031556-eshoponweb:dimension = 1024
20261005-031556-eshoponweb-framing linefalseMeasured end to end through each engine's .NET clientThe statement is false for 8 of the 19 engines of this run: chroma, clickhouse, elasticsearch, milvus, opensearch, typesense, vespa and weaviate are reached through the benchmark's own HttpClient REST code, not through a .NET client of the engine. For those engines the figure is the cost of the benchmark's own request code. A code line of each is cited.
sources
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/" = new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ) = _data = new HttpClient( handler )
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
20261005-031556-eshoponweb-indexunbackedan earlier run gave about 0.09 at 100,000No log was saved for this figure, and the summary does not print the clause. A saved re-run of the MariaDB effort test (10 repeats, 524 and 2,000 random 1024-dimension vectors) read recall@10 at ef 100 of 0.988 to 0.996 at 524 vectors and 0.894 to 0.932 at 2,000. The 100,000-row figure was not re-measured the same way and is dropped.
sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#for which no log was saved = for which no log was saved
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#The 100,000-row figure was not re-measured the same way, so the report drops it. = The 100,000-row figure was not re-measured the same way, so the report drops it.
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992
  • file deploy/bench/recorded-text-classes.json#"drop": "mariadb-recall" = "drop": "mariadb-recall"
20261005-035711-eshoponwebweaviatedurabilityfalseweaviate.compose.yaml sets no persistence variabledeploy/engines/weaviate.compose.yaml sets PERSISTENCE_DATA_PATH to /var/lib/weaviate. The compose file does set a persistence variable.
sources
  • file deploy/engines/weaviate.compose.yaml#PERSISTENCE_DATA_PATH: /var/lib/weaviate = PERSISTENCE_DATA_PATH: /var/lib/weaviate
  • results results@20261005-035711-eshoponweb:targets[weaviate].durability#sets no persistence variable = sets no persistence variable
20261005-035711-eshoponwebclickhousedisk.textmisleading2.42 GiB added by this loadThe figure is the growth of the whole data folder over the engine's turn, as the same line says (5.95 GiB at the end, 3.53 GiB before). The load itself is 524 vectors of 1024 dimensions, 2,146,304 bytes as 4-byte floats (2.05 MiB); the figure is 2,594,340,474 bytes.
sources
  • results results@20261005-035711-eshoponweb:targets[clickhouse].disk.text = 2.42 GiB added by this load (5.95 GiB (whole engine data folder), 3.53 GiB before)
  • results results@20261005-035711-eshoponweb:rows = 524
  • results results@20261005-035711-eshoponweb:dimension = 1024
20261005-035711-eshoponweb-framing linefalseMeasured end to end through each engine's .NET clientThe statement is false for 8 of the 19 engines of this run: chroma, clickhouse, elasticsearch, milvus, opensearch, typesense, vespa and weaviate are reached through the benchmark's own HttpClient REST code, not through a .NET client of the engine. For those engines the figure is the cost of the benchmark's own request code. A code line of each is cited.
sources
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/" = new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ) = _data = new HttpClient( handler )
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
20261005-035711-eshoponweb-indexunbackedan earlier run gave about 0.09 at 100,000No log was saved for this figure, and the summary does not print the clause. A saved re-run of the MariaDB effort test (10 repeats, 524 and 2,000 random 1024-dimension vectors) read recall@10 at ef 100 of 0.988 to 0.996 at 524 vectors and 0.894 to 0.932 at 2,000. The 100,000-row figure was not re-measured the same way and is dropped.
sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#for which no log was saved = for which no log was saved
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#The 100,000-row figure was not re-measured the same way, so the report drops it. = The 100,000-row figure was not re-measured the same way, so the report drops it.
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992
  • file deploy/bench/recorded-text-classes.json#"drop": "mariadb-recall" = "drop": "mariadb-recall"
20261005-073329-eshoponwebweaviatedurabilityfalseweaviate.compose.yaml sets no persistence variabledeploy/engines/weaviate.compose.yaml sets PERSISTENCE_DATA_PATH to /var/lib/weaviate. The compose file does set a persistence variable.
sources
  • file deploy/engines/weaviate.compose.yaml#PERSISTENCE_DATA_PATH: /var/lib/weaviate = PERSISTENCE_DATA_PATH: /var/lib/weaviate
  • results results@20261005-073329-eshoponweb:targets[weaviate].durability#sets no persistence variable = sets no persistence variable
20261005-073329-eshoponweb-framing linefalseMeasured end to end through each engine's .NET clientThe statement is false for 8 of the 19 engines of this run: chroma, clickhouse, elasticsearch, milvus, opensearch, typesense, vespa and weaviate are reached through the benchmark's own HttpClient REST code, not through a .NET client of the engine. For those engines the figure is the cost of the benchmark's own request code. A code line of each is cited.
sources
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/" = new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ) = _data = new HttpClient( handler )
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
20261005-073329-eshoponweb-indexunbackedan earlier run gave about 0.09 at 100,000No log was saved for this figure, and the summary does not print the clause. A saved re-run of the MariaDB effort test (10 repeats, 524 and 2,000 random 1024-dimension vectors) read recall@10 at ef 100 of 0.988 to 0.996 at 524 vectors and 0.894 to 0.932 at 2,000. The 100,000-row figure was not re-measured the same way and is dropped.
sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#for which no log was saved = for which no log was saved
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#The 100,000-row figure was not re-measured the same way, so the report drops it. = The 100,000-row figure was not re-measured the same way, so the report drops it.
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992
  • file deploy/bench/recorded-text-classes.json#"drop": "mariadb-recall" = "drop": "mariadb-recall"
20261005-085448-eshoponwebweaviatedurabilityfalseweaviate.compose.yaml sets no persistence variabledeploy/engines/weaviate.compose.yaml sets PERSISTENCE_DATA_PATH to /var/lib/weaviate. The compose file does set a persistence variable.
sources
  • file deploy/engines/weaviate.compose.yaml#PERSISTENCE_DATA_PATH: /var/lib/weaviate = PERSISTENCE_DATA_PATH: /var/lib/weaviate
  • results results@20261005-085448-eshoponweb:targets[weaviate].durability#sets no persistence variable = sets no persistence variable
20261005-085448-eshoponweb-framing linefalseMeasured end to end through each engine's .NET clientThe statement is false for 8 of the 19 engines of this run: chroma, clickhouse, elasticsearch, milvus, opensearch, typesense, vespa and weaviate are reached through the benchmark's own HttpClient REST code, not through a .NET client of the engine. For those engines the figure is the cost of the benchmark's own request code. A code line of each is cited.
sources
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/" = new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ) = _data = new HttpClient( handler )
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
20261005-085448-eshoponweb-indexunbackedan earlier run gave about 0.09 at 100,000No log was saved for this figure, and the summary does not print the clause. A saved re-run of the MariaDB effort test (10 repeats, 524 and 2,000 random 1024-dimension vectors) read recall@10 at ef 100 of 0.988 to 0.996 at 524 vectors and 0.894 to 0.932 at 2,000. The 100,000-row figure was not re-measured the same way and is dropped.
sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#for which no log was saved = for which no log was saved
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#The 100,000-row figure was not re-measured the same way, so the report drops it. = The 100,000-row figure was not re-measured the same way, so the report drops it.
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992
  • file deploy/bench/recorded-text-classes.json#"drop": "mariadb-recall" = "drop": "mariadb-recall"
20261005-101815-eshoponwebweaviatedurabilityfalseweaviate.compose.yaml sets no persistence variabledeploy/engines/weaviate.compose.yaml sets PERSISTENCE_DATA_PATH to /var/lib/weaviate. The compose file does set a persistence variable.
sources
  • file deploy/engines/weaviate.compose.yaml#PERSISTENCE_DATA_PATH: /var/lib/weaviate = PERSISTENCE_DATA_PATH: /var/lib/weaviate
  • results results@20261005-101815-eshoponweb:targets[weaviate].durability#sets no persistence variable = sets no persistence variable
20261005-101815-eshoponweb-framing linefalseMeasured end to end through each engine's .NET clientThe statement is false for 8 of the 19 engines of this run: chroma, clickhouse, elasticsearch, milvus, opensearch, typesense, vespa and weaviate are reached through the benchmark's own HttpClient REST code, not through a .NET client of the engine. For those engines the figure is the cost of the benchmark's own request code. A code line of each is cited.
sources
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/" = new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ) = _data = new HttpClient( handler )
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
20261005-101815-eshoponweb-indexunbackedan earlier run gave about 0.09 at 100,000No log was saved for this figure, and the summary does not print the clause. A saved re-run of the MariaDB effort test (10 repeats, 524 and 2,000 random 1024-dimension vectors) read recall@10 at ef 100 of 0.988 to 0.996 at 524 vectors and 0.894 to 0.932 at 2,000. The 100,000-row figure was not re-measured the same way and is dropped.
sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#for which no log was saved = for which no log was saved
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#The 100,000-row figure was not re-measured the same way, so the report drops it. = The 100,000-row figure was not re-measured the same way, so the report drops it.
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992
  • file deploy/bench/recorded-text-classes.json#"drop": "mariadb-recall" = "drop": "mariadb-recall"
20261006-130619-eshoponwebweaviatedurabilityfalseweaviate.compose.yaml sets no persistence variabledeploy/engines/weaviate.compose.yaml sets PERSISTENCE_DATA_PATH to /var/lib/weaviate. The compose file does set a persistence variable.
sources
  • file deploy/engines/weaviate.compose.yaml#PERSISTENCE_DATA_PATH: /var/lib/weaviate = PERSISTENCE_DATA_PATH: /var/lib/weaviate
  • results results@20261006-130619-eshoponweb:targets[weaviate].durability#sets no persistence variable = sets no persistence variable
20261006-130619-eshoponwebclickhousedisk.textmisleading4.21 GiB added by this loadThe figure is the growth of the whole data folder over the engine's turn, as the same line says (4.21 GiB at the end, 99.17 KiB before). The load itself is 524 vectors of 1024 dimensions, 2,146,304 bytes as 4-byte floats (2.05 MiB); the figure is 4,515,349,223 bytes.
sources
  • results results@20261006-130619-eshoponweb:targets[clickhouse].disk.text = 4.21 GiB added by this load (4.21 GiB (whole engine data folder), 99.17 KiB before)
  • results results@20261006-130619-eshoponweb:rows = 524
  • results results@20261006-130619-eshoponweb:dimension = 1024
20261006-130619-eshoponweb-framing linefalseMeasured end to end through each engine's .NET clientThe statement is false for 8 of the 19 engines of this run: chroma, clickhouse, elasticsearch, milvus, opensearch, typesense, vespa and weaviate are reached through the benchmark's own HttpClient REST code, not through a .NET client of the engine. For those engines the figure is the cost of the benchmark's own request code. A code line of each is cited.
sources
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/" = new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ) = _data = new HttpClient( handler )
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
20261006-130619-eshoponweb-indexunbackedan earlier run gave about 0.09 at 100,000No log was saved for this figure, and the summary does not print the clause. A saved re-run of the MariaDB effort test (10 repeats, 524 and 2,000 random 1024-dimension vectors) read recall@10 at ef 100 of 0.988 to 0.996 at 524 vectors and 0.894 to 0.932 at 2,000. The 100,000-row figure was not re-measured the same way and is dropped.
sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#for which no log was saved = for which no log was saved
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#The 100,000-row figure was not re-measured the same way, so the report drops it. = The 100,000-row figure was not re-measured the same way, so the report drops it.
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992
  • file deploy/bench/recorded-text-classes.json#"drop": "mariadb-recall" = "drop": "mariadb-recall"
20261006-130619-eshoponweb-notesunbackedso every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runsNo saved reading backs the clause for this run. The APERF and MPERF analyses kept in design/bench-inputs/observer-v8 are of the three v8 runs, not of this one, and the summary does not print the clause. In the v8 runs, made under the same pin, the observer read a pass under it (see the correction to the clause on those pages).
sources
  • results results@20261006-130619-eshoponweb:notes[14]#so every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runs = so every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runs
  • file design/bench-inputs/observer-v8/SOURCES.txt#Byte copies of the run operator's analysis of the three v8 runs (seeds 801, 802, 803) = Byte copies of the run operator's analysis of the three v8 runs (seeds 801, 802, 803)
  • file deploy/bench/recorded-text-classes.json#"drop": "clock-held" = "drop": "clock-held"
20261006-142724-eshoponwebweaviatedurabilityfalseweaviate.compose.yaml sets no persistence variabledeploy/engines/weaviate.compose.yaml sets PERSISTENCE_DATA_PATH to /var/lib/weaviate. The compose file does set a persistence variable.
sources
  • file deploy/engines/weaviate.compose.yaml#PERSISTENCE_DATA_PATH: /var/lib/weaviate = PERSISTENCE_DATA_PATH: /var/lib/weaviate
  • results results@20261006-142724-eshoponweb:targets[weaviate].durability#sets no persistence variable = sets no persistence variable
20261006-142724-eshoponwebclickhousedisk.textmisleading2.57 GiB added by this loadThe figure is the growth of the whole data folder over the engine's turn, as the same line says (6.79 GiB at the end, 4.22 GiB before). The load itself is 524 vectors of 1024 dimensions, 2,146,304 bytes as 4-byte floats (2.05 MiB); the figure is 2,758,116,325 bytes.
sources
  • results results@20261006-142724-eshoponweb:targets[clickhouse].disk.text = 2.57 GiB added by this load (6.79 GiB (whole engine data folder), 4.22 GiB before)
  • results results@20261006-142724-eshoponweb:rows = 524
  • results results@20261006-142724-eshoponweb:dimension = 1024
20261006-142724-eshoponweb-framing linefalseMeasured end to end through each engine's .NET clientThe statement is false for 8 of the 19 engines of this run: chroma, clickhouse, elasticsearch, milvus, opensearch, typesense, vespa and weaviate are reached through the benchmark's own HttpClient REST code, not through a .NET client of the engine. For those engines the figure is the cost of the benchmark's own request code. A code line of each is cited.
sources
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/" = new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ) = _data = new HttpClient( handler )
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
20261006-142724-eshoponweb-indexunbackedan earlier run gave about 0.09 at 100,000No log was saved for this figure, and the summary does not print the clause. A saved re-run of the MariaDB effort test (10 repeats, 524 and 2,000 random 1024-dimension vectors) read recall@10 at ef 100 of 0.988 to 0.996 at 524 vectors and 0.894 to 0.932 at 2,000. The 100,000-row figure was not re-measured the same way and is dropped.
sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#for which no log was saved = for which no log was saved
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#The 100,000-row figure was not re-measured the same way, so the report drops it. = The 100,000-row figure was not re-measured the same way, so the report drops it.
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992
  • file deploy/bench/recorded-text-classes.json#"drop": "mariadb-recall" = "drop": "mariadb-recall"
20261006-142724-eshoponweb-notesunbackedso every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runsNo saved reading backs the clause for this run. The APERF and MPERF analyses kept in design/bench-inputs/observer-v8 are of the three v8 runs, not of this one, and the summary does not print the clause. In the v8 runs, made under the same pin, the observer read a pass under it (see the correction to the clause on those pages).
sources
  • results results@20261006-142724-eshoponweb:notes[14]#so every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runs = so every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runs
  • file design/bench-inputs/observer-v8/SOURCES.txt#Byte copies of the run operator's analysis of the three v8 runs (seeds 801, 802, 803) = Byte copies of the run operator's analysis of the three v8 runs (seeds 801, 802, 803)
  • file deploy/bench/recorded-text-classes.json#"drop": "clock-held" = "drop": "clock-held"
20261006-154837-eshoponwebweaviatedurabilityfalseweaviate.compose.yaml sets no persistence variabledeploy/engines/weaviate.compose.yaml sets PERSISTENCE_DATA_PATH to /var/lib/weaviate. The compose file does set a persistence variable.
sources
  • file deploy/engines/weaviate.compose.yaml#PERSISTENCE_DATA_PATH: /var/lib/weaviate = PERSISTENCE_DATA_PATH: /var/lib/weaviate
  • results results@20261006-154837-eshoponweb:targets[weaviate].durability#sets no persistence variable = sets no persistence variable
20261006-154837-eshoponwebclickhousedisk.textmisleading0 B added by this loadThe figure is the growth of the whole data folder over the engine's turn, as the same line says (6.79 GiB at the end, 6.79 GiB before). The load itself is 524 vectors of 1024 dimensions, 2,146,304 bytes as 4-byte floats (2.05 MiB); the figure is 0 bytes.
sources
  • results results@20261006-154837-eshoponweb:targets[clickhouse].disk.text = 0 B added by this load (6.79 GiB (whole engine data folder), 6.79 GiB before)
  • results results@20261006-154837-eshoponweb:rows = 524
  • results results@20261006-154837-eshoponweb:dimension = 1024
20261006-154837-eshoponweb-framing linefalseMeasured end to end through each engine's .NET clientThe statement is false for 8 of the 19 engines of this run: chroma, clickhouse, elasticsearch, milvus, opensearch, typesense, vespa and weaviate are reached through the benchmark's own HttpClient REST code, not through a .NET client of the engine. For those engines the figure is the cost of the benchmark's own request code. A code line of each is cited.
sources
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/" = new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ) = _data = new HttpClient( handler )
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
20261006-154837-eshoponweb-indexunbackedan earlier run gave about 0.09 at 100,000No log was saved for this figure, and the summary does not print the clause. A saved re-run of the MariaDB effort test (10 repeats, 524 and 2,000 random 1024-dimension vectors) read recall@10 at ef 100 of 0.988 to 0.996 at 524 vectors and 0.894 to 0.932 at 2,000. The 100,000-row figure was not re-measured the same way and is dropped.
sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#for which no log was saved = for which no log was saved
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#The 100,000-row figure was not re-measured the same way, so the report drops it. = The 100,000-row figure was not re-measured the same way, so the report drops it.
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992
  • file deploy/bench/recorded-text-classes.json#"drop": "mariadb-recall" = "drop": "mariadb-recall"
20261006-154837-eshoponweb-notesunbackedso every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runsNo saved reading backs the clause for this run. The APERF and MPERF analyses kept in design/bench-inputs/observer-v8 are of the three v8 runs, not of this one, and the summary does not print the clause. In the v8 runs, made under the same pin, the observer read a pass under it (see the correction to the clause on those pages).
sources
  • results results@20261006-154837-eshoponweb:notes[14]#so every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runs = so every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runs
  • file design/bench-inputs/observer-v8/SOURCES.txt#Byte copies of the run operator's analysis of the three v8 runs (seeds 801, 802, 803) = Byte copies of the run operator's analysis of the three v8 runs (seeds 801, 802, 803)
  • file deploy/bench/recorded-text-classes.json#"drop": "clock-held" = "drop": "clock-held"
20261007-205106-eshoponwebweaviatedurabilityfalseweaviate.compose.yaml sets no persistence variabledeploy/engines/weaviate.compose.yaml sets PERSISTENCE_DATA_PATH to /var/lib/weaviate. The compose file does set a persistence variable.
sources
  • file deploy/engines/weaviate.compose.yaml#PERSISTENCE_DATA_PATH: /var/lib/weaviate = PERSISTENCE_DATA_PATH: /var/lib/weaviate
  • results results@20261007-205106-eshoponweb:targets[weaviate].durability#sets no persistence variable = sets no persistence variable
20261007-205106-eshoponwebclickhousedisk.textmisleading5.29 GiB added by this loadThe figure is the growth of the whole data folder over the engine's turn, as the same line says (5.31 GiB at the end, 14.01 MiB before). The load itself is 524 vectors of 1024 dimensions, 2,146,304 bytes as 4-byte floats (2.05 MiB); the figure is 5,685,109,857 bytes.
sources
  • results results@20261007-205106-eshoponweb:targets[clickhouse].disk.text = 5.29 GiB added by this load (5.31 GiB (whole engine data folder), 14.01 MiB before)
  • results results@20261007-205106-eshoponweb:rows = 524
  • results results@20261007-205106-eshoponweb:dimension = 1024
20261007-205106-eshoponwebclickhousedataFolder.resetmisleading(the folder was steady)The words describe the folder after the reset: it stayed within the tolerance over a stability window before the after reading was taken. They do not say the reset left the folder unchanged; the same sentence records 4.25 GiB before and 14.01 MiB after.
sources
  • file src/GenericVectorBuilder.Bench/Targets/ClickHouseStartState.cs#the folder was steady = the folder was steady
  • file src/GenericVectorBuilder.Bench/Targets/ClickHouseStartState.cs#True when the folder stayed within the tolerance over a full stability window before the deadline. = True when the folder stayed within the tolerance over a full stability window before the deadline.
  • results results@20261007-205106-eshoponweb:targets[clickhouse].dataFolder.reset = truncated 9 MergeTree log tables in database system (asynchronous_insert_log, asynchronous_metric_log, background_schedule_pool_log, metric_log, part_log, processors_profile_log, query_log, text_log, trace_log); ClickHouse's own active bytes of those tables 2.09 GiB before and 0 B after; data folder 4.25 GiB before and 14.01 MiB after (the folder was steady); not truncated, name does not end in _l...
20261007-205106-eshoponwebmariadbdataFolder.bytesAtStartmisleading166.78 MiB at the startA witness read this data folder at 162,269,780 bytes (154.75 MiB) when the container was created, before the engine ran. The tool recorded 174,877,277 bytes (166.78 MiB) as the start, 8 percent above the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-801.txt#X12 = ('mariadb', 174877277, 162269780)
  • results results@20261007-205106-eshoponweb:targets[mariadb].dataFolder.bytesAtStart = 174877277
20261007-205106-eshoponwebmilvusdataFolder.bytesAtStartmisleading218 MiB at the startA witness read this data folder at 164,473,352 bytes (156.85 MiB) when the container was created, before the engine ran. The tool recorded 228,593,016 bytes (218 MiB) as the start, 39 percent above the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-801.txt#X12 = ('milvus', 228593016, 164473352)
  • results results@20261007-205106-eshoponweb:targets[milvus].dataFolder.bytesAtStart = 228593016
20261007-205106-eshoponwebsqldataFolder.bytesAtStartmisleading105.06 MiB at the startA witness read this data folder at 380,452,110 bytes (362.83 MiB) when the container was created, before the engine ran. The tool recorded 110,158,310 bytes (105.06 MiB) as the start, 71 percent below the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-801.txt#X12 = ('sql', 110158310, 380452110)
  • results results@20261007-205106-eshoponweb:targets[sql].dataFolder.bytesAtStart = 110158310
20261007-205106-eshoponwebsql-diskanndataFolder.bytesAtStartmisleading105.05 MiB at the startA witness read this data folder at 380,452,110 bytes (362.83 MiB) when the container was created, before the engine ran. The tool recorded 110,154,214 bytes (105.05 MiB) as the start, 71 percent below the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-801.txt#X12 = ('sql-diskann', 110154214, 380452110)
  • results results@20261007-205106-eshoponweb:targets[sql-diskann].dataFolder.bytesAtStart = 110154214
20261007-205106-eshoponwebtypesensedataFolder.bytesAtStartmisleading707.22 MiB at the startA witness read this data folder at 293,394,812 bytes (279.8 MiB) when the container was created, before the engine ran. The tool recorded 741,572,783 bytes (707.22 MiB) as the start, 153 percent above the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-801.txt#X12 = ('typesense', 741572783, 293394812)
  • results results@20261007-205106-eshoponweb:targets[typesense].dataFolder.bytesAtStart = 741572783
20261007-205106-eshoponweb-framing linefalseMeasured end to end through each engine's .NET clientThe statement is false for 8 of the 19 engines of this run: chroma, clickhouse, elasticsearch, milvus, opensearch, typesense, vespa and weaviate are reached through the benchmark's own HttpClient REST code, not through a .NET client of the engine. For those engines the figure is the cost of the benchmark's own request code. A code line of each is cited.
sources
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/" = new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ) = _data = new HttpClient( handler )
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
20261007-205106-eshoponweb-indexunbackedan earlier run gave about 0.09 at 100,000No log was saved for this figure, and the summary does not print the clause. A saved re-run of the MariaDB effort test (10 repeats, 524 and 2,000 random 1024-dimension vectors) read recall@10 at ef 100 of 0.988 to 0.996 at 524 vectors and 0.894 to 0.932 at 2,000. The 100,000-row figure was not re-measured the same way and is dropped.
sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#for which no log was saved = for which no log was saved
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#The 100,000-row figure was not re-measured the same way, so the report drops it. = The 100,000-row figure was not re-measured the same way, so the report drops it.
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992
  • file deploy/bench/recorded-text-classes.json#"drop": "mariadb-recall" = "drop": "mariadb-recall"
20261007-205106-eshoponweb-notesfalseso every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runsThe observer's APERF and MPERF readings of this run put oracle's default@8 pass (eight searchers at once) under the pin: CPU 7 read 3476.97 MHz against 3500 MHz, 65.8 basis points under it (0.658 percent). That is inside the observer's own limit of 100 basis points: the pin held to within that, and it did not hold at the ceiling. The clause says every CPU's clock is held at its ceiling whatever the engine runs; for that pass it was not. The summary does not print the clause.
sources
  • results results@20261007-205106-eshoponweb:notes[16]#so every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runs = so every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runs
  • file design/bench-inputs/observer-v8/analysis-801.txt#worst deviation 65.8 bp (oracle/default@8 cpu7 3476.97 MHz) = worst deviation 65.8 bp (oracle/default@8 cpu7 3476.97 MHz)
  • file deploy/bench/recorded-text-classes.json#"drop": "clock-held" = "drop": "clock-held"
20261007-221429-eshoponwebweaviatedurabilityfalseweaviate.compose.yaml sets no persistence variabledeploy/engines/weaviate.compose.yaml sets PERSISTENCE_DATA_PATH to /var/lib/weaviate. The compose file does set a persistence variable.
sources
  • file deploy/engines/weaviate.compose.yaml#PERSISTENCE_DATA_PATH: /var/lib/weaviate = PERSISTENCE_DATA_PATH: /var/lib/weaviate
  • results results@20261007-221429-eshoponweb:targets[weaviate].durability#sets no persistence variable = sets no persistence variable
20261007-221429-eshoponwebclickhousedisk.textmisleading4.18 GiB added by this loadThe figure is the growth of the whole data folder over the engine's turn, as the same line says (6.9 GiB at the end, 2.72 GiB before). The load itself is 524 vectors of 1024 dimensions, 2,146,304 bytes as 4-byte floats (2.05 MiB); the figure is 4,491,193,144 bytes.
sources
  • results results@20261007-221429-eshoponweb:targets[clickhouse].disk.text = 4.18 GiB added by this load (6.9 GiB (whole engine data folder), 2.72 GiB before)
  • results results@20261007-221429-eshoponweb:rows = 524
  • results results@20261007-221429-eshoponweb:dimension = 1024
20261007-221429-eshoponwebclickhousedataFolder.resetmisleading(the folder was steady)The words describe the folder after the reset: it stayed within the tolerance over a stability window before the after reading was taken. They do not say the reset left the folder unchanged; the same sentence records 5.32 GiB before and 2.72 GiB after.
sources
  • file src/GenericVectorBuilder.Bench/Targets/ClickHouseStartState.cs#the folder was steady = the folder was steady
  • file src/GenericVectorBuilder.Bench/Targets/ClickHouseStartState.cs#True when the folder stayed within the tolerance over a full stability window before the deadline. = True when the folder stayed within the tolerance over a full stability window before the deadline.
  • results results@20261007-221429-eshoponweb:targets[clickhouse].dataFolder.reset = truncated 9 MergeTree log tables in database system (asynchronous_insert_log, asynchronous_metric_log, background_schedule_pool_log, metric_log, part_log, processors_profile_log, query_log, text_log, trace_log); ClickHouse's own active bytes of those tables 183.97 KiB before and 0 B after; data folder 5.32 GiB before and 2.72 GiB after (the folder was steady); not truncated, name does not end in _...
20261007-221429-eshoponwebmariadbdataFolder.bytesAtStartmisleading166.77 MiB at the startA witness read this data folder at 162,258,887 bytes (154.74 MiB) when the container was created, before the engine ran. The tool recorded 174,866,384 bytes (166.77 MiB) as the start, 8 percent above the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-802.txt#X12 = ('mariadb', 174866384, 162258887)
  • results results@20261007-221429-eshoponweb:targets[mariadb].dataFolder.bytesAtStart = 174866384
20261007-221429-eshoponwebmilvusdataFolder.bytesAtStartmisleading226.87 MiB at the startA witness read this data folder at 173,771,992 bytes (165.72 MiB) when the container was created, before the engine ran. The tool recorded 237,892,829 bytes (226.87 MiB) as the start, 37 percent above the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-802.txt#X12 = ('milvus', 237892829, 173771992)
  • results results@20261007-221429-eshoponweb:targets[milvus].dataFolder.bytesAtStart = 237892829
20261007-221429-eshoponwebsqldataFolder.bytesAtStartmisleading105.07 MiB at the startA witness read this data folder at 380,458,862 bytes (362.83 MiB) when the container was created, before the engine ran. The tool recorded 110,169,158 bytes (105.07 MiB) as the start, 71 percent below the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-802.txt#X12 = ('sql', 110169158, 380458862)
  • results results@20261007-221429-eshoponweb:targets[sql].dataFolder.bytesAtStart = 110169158
20261007-221429-eshoponwebsql-diskanndataFolder.bytesAtStartmisleading105.06 MiB at the startA witness read this data folder at 380,458,862 bytes (362.83 MiB) when the container was created, before the engine ran. The tool recorded 110,162,406 bytes (105.06 MiB) as the start, 71 percent below the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-802.txt#X12 = ('sql-diskann', 110162406, 380458862)
  • results results@20261007-221429-eshoponweb:targets[sql-diskann].dataFolder.bytesAtStart = 110162406
20261007-221429-eshoponwebtypesensedataFolder.bytesAtStartmisleading856.64 MiB at the startA witness read this data folder at 301,621,308 bytes (287.65 MiB) when the container was created, before the engine ran. The tool recorded 898,253,504 bytes (856.64 MiB) as the start, 198 percent above the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-802.txt#X12 = ('typesense', 898253504, 301621308)
  • results results@20261007-221429-eshoponweb:targets[typesense].dataFolder.bytesAtStart = 898253504
20261007-221429-eshoponweb-framing linefalseMeasured end to end through each engine's .NET clientThe statement is false for 8 of the 19 engines of this run: chroma, clickhouse, elasticsearch, milvus, opensearch, typesense, vespa and weaviate are reached through the benchmark's own HttpClient REST code, not through a .NET client of the engine. For those engines the figure is the cost of the benchmark's own request code. A code line of each is cited.
sources
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/" = new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ) = _data = new HttpClient( handler )
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
20261007-221429-eshoponweb-indexunbackedan earlier run gave about 0.09 at 100,000No log was saved for this figure, and the summary does not print the clause. A saved re-run of the MariaDB effort test (10 repeats, 524 and 2,000 random 1024-dimension vectors) read recall@10 at ef 100 of 0.988 to 0.996 at 524 vectors and 0.894 to 0.932 at 2,000. The 100,000-row figure was not re-measured the same way and is dropped.
sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#for which no log was saved = for which no log was saved
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#The 100,000-row figure was not re-measured the same way, so the report drops it. = The 100,000-row figure was not re-measured the same way, so the report drops it.
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992
  • file deploy/bench/recorded-text-classes.json#"drop": "mariadb-recall" = "drop": "mariadb-recall"
20261007-221429-eshoponweb-notesfalseso every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runsThe observer's APERF and MPERF readings of this run put oracle's default@8 pass (eight searchers at once) under the pin: CPU 7 read 3483.59 MHz against 3500 MHz, 46.9 basis points under it (0.469 percent). That is inside the observer's own limit of 100 basis points: the pin held to within that, and it did not hold at the ceiling. The clause says every CPU's clock is held at its ceiling whatever the engine runs; for that pass it was not. The summary does not print the clause.
sources
  • results results@20261007-221429-eshoponweb:notes[16]#so every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runs = so every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runs
  • file design/bench-inputs/observer-v8/analysis-802.txt#worst deviation 46.9 bp (oracle/default@8 cpu7 3483.59 MHz) = worst deviation 46.9 bp (oracle/default@8 cpu7 3483.59 MHz)
  • file deploy/bench/recorded-text-classes.json#"drop": "clock-held" = "drop": "clock-held"
20261007-233551-eshoponwebweaviatedurabilityfalseweaviate.compose.yaml sets no persistence variabledeploy/engines/weaviate.compose.yaml sets PERSISTENCE_DATA_PATH to /var/lib/weaviate. The compose file does set a persistence variable.
sources
  • file deploy/engines/weaviate.compose.yaml#PERSISTENCE_DATA_PATH: /var/lib/weaviate = PERSISTENCE_DATA_PATH: /var/lib/weaviate
  • results results@20261007-233551-eshoponweb:targets[weaviate].durability#sets no persistence variable = sets no persistence variable
20261007-233551-eshoponwebclickhousedisk.textmisleading4.67 GiB added by this loadThe figure is the growth of the whole data folder over the engine's turn, as the same line says (6.76 GiB at the end, 2.09 GiB before). The load itself is 524 vectors of 1024 dimensions, 2,146,304 bytes as 4-byte floats (2.05 MiB); the figure is 5,014,957,314 bytes.
sources
  • results results@20261007-233551-eshoponweb:targets[clickhouse].disk.text = 4.67 GiB added by this load (6.76 GiB (whole engine data folder), 2.09 GiB before)
  • results results@20261007-233551-eshoponweb:rows = 524
  • results results@20261007-233551-eshoponweb:dimension = 1024
20261007-233551-eshoponwebclickhousedataFolder.resetmisleading(the folder was steady)The words describe the folder after the reset: it stayed within the tolerance over a stability window before the after reading was taken. They do not say the reset left the folder unchanged; the same sentence records 6.92 GiB before and 2.09 GiB after.
sources
  • file src/GenericVectorBuilder.Bench/Targets/ClickHouseStartState.cs#the folder was steady = the folder was steady
  • file src/GenericVectorBuilder.Bench/Targets/ClickHouseStartState.cs#True when the folder stayed within the tolerance over a full stability window before the deadline. = True when the folder stayed within the tolerance over a full stability window before the deadline.
  • results results@20261007-233551-eshoponweb:targets[clickhouse].dataFolder.reset = truncated 9 MergeTree log tables in database system (asynchronous_insert_log, asynchronous_metric_log, background_schedule_pool_log, metric_log, part_log, processors_profile_log, query_log, text_log, trace_log); ClickHouse's own active bytes of those tables 185.06 KiB before and 0 B after; data folder 6.92 GiB before and 2.09 GiB after (the folder was steady); not truncated, name does not end in _...
20261007-233551-eshoponwebmariadbdataFolder.bytesAtStartmisleading166.77 MiB at the startA witness read this data folder at 162,258,911 bytes (154.74 MiB) when the container was created, before the engine ran. The tool recorded 174,866,408 bytes (166.77 MiB) as the start, 8 percent above the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-803.txt#X12 = ('mariadb', 174866408, 162258911)
  • results results@20261007-233551-eshoponweb:targets[mariadb].dataFolder.bytesAtStart = 174866408
20261007-233551-eshoponwebmilvusdataFolder.bytesAtStartmisleading235.67 MiB at the startA witness read this data folder at 183,071,822 bytes (174.59 MiB) when the container was created, before the engine ran. The tool recorded 247,123,030 bytes (235.67 MiB) as the start, 35 percent above the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-803.txt#X12 = ('milvus', 247123030, 183071822)
  • results results@20261007-233551-eshoponweb:targets[milvus].dataFolder.bytesAtStart = 247123030
20261007-233551-eshoponwebsqldataFolder.bytesAtStartmisleading105.07 MiB at the startA witness read this data folder at 380,464,398 bytes (362.84 MiB) when the container was created, before the engine ran. The tool recorded 110,170,598 bytes (105.07 MiB) as the start, 71 percent below the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-803.txt#X12 = ('sql', 110170598, 380464398)
  • results results@20261007-233551-eshoponweb:targets[sql].dataFolder.bytesAtStart = 110170598
20261007-233551-eshoponwebsql-diskanndataFolder.bytesAtStartmisleading105.06 MiB at the startA witness read this data folder at 380,464,398 bytes (362.84 MiB) when the container was created, before the engine ran. The tool recorded 110,167,942 bytes (105.06 MiB) as the start, 71 percent below the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-803.txt#X12 = ('sql-diskann', 110167942, 380464398)
  • results results@20261007-233551-eshoponweb:targets[sql-diskann].dataFolder.bytesAtStart = 110167942
20261007-233551-eshoponwebtypesensedataFolder.bytesAtStartmisleading688.52 MiB at the startA witness read this data folder at 308,306,092 bytes (294.02 MiB) when the container was created, before the engine ran. The tool recorded 721,960,355 bytes (688.52 MiB) as the start, 134 percent above the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-803.txt#X12 = ('typesense', 721960355, 308306092)
  • results results@20261007-233551-eshoponweb:targets[typesense].dataFolder.bytesAtStart = 721960355
20261007-233551-eshoponwebvespadataFolder.bytesAtStartmisleading1.9 GiB at the startA witness read this data folder at 2,280,491,799 bytes (2.12 GiB) when the container was created, before the engine ran. The tool recorded 2,042,392,842 bytes (1.9 GiB) as the start, 10 percent below the witness. The two readings disagree; this line prints the tool's.
sources
  • file design/bench-inputs/observer-v8/analysis-803.txt#X12 = ('vespa', 2042392842, 2280491799)
  • results results@20261007-233551-eshoponweb:targets[vespa].dataFolder.bytesAtStart = 2042392842
20261007-233551-eshoponwebvespadisk.textmisleading235.33 MiB added by this loadThe figure rests on the tool's start reading (2,042,392,842 bytes), which the witness disputes (above). From the witness's reading and the recorded end (2,291,891,892 bytes) the folder grew by 11,400,093 bytes (10.87 MiB) over the turn.
sources
  • file design/bench-inputs/observer-v8/analysis-803.txt#X12 = ('vespa', 2042392842, 2280491799)
  • results results@20261007-233551-eshoponweb:targets[vespa].dataFolder.bytesAtStart = 2042392842
  • results results@20261007-233551-eshoponweb:targets[vespa].dataFolder.bytesAtEnd = 2291891892
20261007-233551-eshoponweb-framing linefalseMeasured end to end through each engine's .NET clientThe statement is false for 8 of the 19 engines of this run: chroma, clickhouse, elasticsearch, milvus, opensearch, typesense, vespa and weaviate are reached through the benchmark's own HttpClient REST code, not through a .NET client of the engine. For those engines the figure is the cost of the benchmark's own request code. A code line of each is cited.
sources
  • file src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/" = new HttpClient { BaseAddress = new Uri( $"http://{options.Host}:{options.Port}/"
  • file src/GenericVectorBuilder.Engines/Sinks/ElasticsearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
  • file src/GenericVectorBuilder.Engines/Sinks/OpenSearchRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/TypesenseRest.cs#new HttpClient { BaseAddress = new Uri( _baseUrl + "/" ) = new HttpClient { BaseAddress = new Uri( _baseUrl + "/" )
  • file src/GenericVectorBuilder.Engines/Sinks/VespaRest.cs#_data = new HttpClient( handler ) = _data = new HttpClient( handler )
  • file src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#new HttpClient { BaseAddress = new Uri( options.BaseUrl = new HttpClient { BaseAddress = new Uri( options.BaseUrl
20261007-233551-eshoponweb-indexunbackedan earlier run gave about 0.09 at 100,000No log was saved for this figure, and the summary does not print the clause. A saved re-run of the MariaDB effort test (10 repeats, 524 and 2,000 random 1024-dimension vectors) read recall@10 at ef 100 of 0.988 to 0.996 at 524 vectors and 0.894 to 0.932 at 2,000. The 100,000-row figure was not re-measured the same way and is dropped.
sources
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#for which no log was saved = for which no log was saved
  • file design/bench-inputs/mariadb-effort-2026-10-07/SOURCES.txt#The 100,000-row figure was not re-measured the same way, so the report drops it. = The 100,000-row figure was not re-measured the same way, so the report drops it.
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.872, ef 100 0.988, ef 3200 0.988
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996 = RECALL@10 on 524 random 1024-dim vectors, 50 queries: ef 20 0.886, ef 100 0.996, ef 3200 0.996
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.468, ef 100 0.894, ef 3200 0.994
  • file design/bench-inputs/mariadb-effort-2026-10-07/run.log#RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992 = RECALL@10 on 2000 random 1024-dim vectors, 50 queries: ef 20 0.482, ef 100 0.932, ef 3200 0.992
  • file deploy/bench/recorded-text-classes.json#"drop": "mariadb-recall" = "drop": "mariadb-recall"
20261007-233551-eshoponweb-notesfalseso every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runsThe observer's APERF and MPERF readings of this run put oracle's default@8 pass (eight searchers at once) under the pin: CPU 7 read 3482.66 MHz against 3500 MHz, 49.5 basis points under it (0.495 percent). That is inside the observer's own limit of 100 basis points: the pin held to within that, and it did not hold at the ceiling. The clause says every CPU's clock is held at its ceiling whatever the engine runs; for that pass it was not. The summary does not print the clause.
sources
  • results results@20261007-233551-eshoponweb:notes[16]#so every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runs = so every CPU's clock is held at its ceiling of 3500 MHz whatever the engine runs
  • file design/bench-inputs/observer-v8/analysis-803.txt#worst deviation 49.5 bp (oracle/default@8 cpu7 3482.66 MHz) = worst deviation 49.5 bp (oracle/default@8 cpu7 3482.66 MHz)
  • file deploy/bench/recorded-text-classes.json#"drop": "clock-held" = "drop": "clock-held"
Recorded engine texts, clause by clause

Each clause of a recorded text that no sentence on this page prints, with the class the report gives it and what it is bound to.

EngineFieldRunClauseClassPrinted in the reportBound to
clickhouseindex20261007-205106-eshoponwebvector_similarity HNSW cosineDistance, quantization bf16, M=16 ef_construction=128,documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#INDEX vec_idx embedding TYPE vector_similarity( 'hnsw', 'cosineDistance', {dimension}, '{_options.Quantization}', {_options.HnswM}, {_options.HnswEfConstruction} )
  • src/GenericVectorBuilder.Engines/Sinks/ClickHouseSinkOptions.cs#public string Quantization { get; set; } = "bf16";
  • src/GenericVectorBuilder.Engines/Sinks/ClickHouseSinkOptions.cs#public int HnswM { get; set; } = 16;
  • src/GenericVectorBuilder.Engines/Sinks/ClickHouseSinkOptions.cs#public int HnswEfConstruction { get; set; } = 128;
clickhouseindex20261007-205106-eshoponwebhnsw_candidate_list_size_for_search=256, rescoring off;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/ClickHouseSink.cs#hnsw_candidate_list_size_for_search = {_options.HnswEfSearch}, vector_search_with_rescoring = {_options.Rescoring}
  • src/GenericVectorBuilder.Engines/Sinks/ClickHouseSinkOptions.cs#public int HnswEfSearch { get; set; } = 256;
  • src/GenericVectorBuilder.Engines/Sinks/ClickHouseSinkOptions.cs#public int Rescoring { get; set; }
clickhouseindex20261007-205106-eshoponwebexact mode = full scan with skip indexes offunverifiedyes-
vespaindex20261007-205106-eshoponwebHNSW float32 tensor, prenormalized-angular (cosine), max-links-per-node=16, neighbors-to-explore-at-insert=128;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/VespaApplicationPackage.cs#type tensor<float>(x[{{dimension}}])
  • src/GenericVectorBuilder.Engines/Sinks/VespaApplicationPackage.cs#distance-metric: prenormalized-angular
  • src/GenericVectorBuilder.Engines/Sinks/VespaApplicationPackage.cs#max-links-per-node: 16
  • src/GenericVectorBuilder.Engines/Sinks/VespaApplicationPackage.cs#neighbors-to-explore-at-insert: 128
vespaindex20261007-205106-eshoponwebsearch targetHits=top, ef=100 via exploreAdditionalHits;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/VespaSink.cs#targetHits:{top},hnsw.exploreAdditionalHits:{extra}
  • src/GenericVectorBuilder.Engines/Sinks/VespaSinkOptions.cs#int EfSearch = 100
vespaindex20261007-205106-eshoponwebexact mode = approximate:false;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/VespaSink.cs#targetHits:{top},approximate:false
vespaindex20261007-205106-eshoponwebvectors held in memoryunverifiedyes-
oracleindex20261007-205106-eshoponwebHNSW in-memory neighbor graph NEIGHBORS=16 EFCONSTRUCTION=128,documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/OracleSink.cs#ORGANIZATION INMEMORY NEIGHBOR GRAPH DISTANCE COSINE
  • src/GenericVectorBuilder.Engines/Sinks/OracleSink.cs#PARAMETERS ( TYPE HNSW, NEIGHBORS {_options.HnswNeighbors}, EFCONSTRUCTION {_options.HnswEfConstruction} )
  • src/GenericVectorBuilder.Engines/Sinks/OracleSinkOptions.cs#public int HnswNeighbors { get; set; } = 16;
  • src/GenericVectorBuilder.Engines/Sinks/OracleSinkOptions.cs#public int HnswEfConstruction { get; set; } = 128;
oracleindex20261007-205106-eshoponwebEFSEARCH=100 per query, cosine;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/OracleSink.cs#APPROX FIRST :top ROWS ONLY WITH TARGET ACCURACY PARAMETERS ( EFSEARCH {Math.Max( _options.HnswEfSearch, top )} )
  • src/GenericVectorBuilder.Engines/Sinks/OracleSink.cs#VECTOR_DISTANCE( embedding, :query, COSINE )
  • src/GenericVectorBuilder.Engines/Sinks/OracleSinkOptions.cs#public int HnswEfSearch { get; set; } = 100;
oracleindex20261007-205106-eshoponwebexact mode = FETCH EXACT FIRST (full scan);documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/OracleSink.cs#"EXACT FIRST :top ROWS ONLY"
oracleindex20261007-205106-eshoponwebOracle Free caps itself at 2 CPUs (cpu_count 2 in V$PARAMETER, edition FREE in V$INSTANCE, 8 host CPUs in V$OSSTAT NUM_CPUS;read-backyes
  • src/GenericVectorBuilder.Engines/Sinks/OracleCpuCap.cs#cpu_count {CpuCount.ToString( CultureInfo.InvariantCulture )} in V$PARAMETER
oracleindex20261007-205106-eshoponwebthe 2 CPU thread limit is Oracle's documented Free edition limit)unverifiedyes-
elasticsearchindex20261007-205106-eshoponwebHNSW float32, no quantization, m=16, ef_construction=128,read-backyes
  • results:targets[elasticsearch].load.indexNote#index_options hnsw m=16 ef_construction=128
elasticsearchindex20261007-205106-eshoponwebcosine;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/ElasticsearchSink.cs#similarity = "cosine",
elasticsearchindex20261007-205106-eshoponwebsearch k=top, num_candidates=100;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/ElasticsearchSink.cs#knn = new { field = "vector", query_vector = vector, k = top, num_candidates = candidates }
  • src/GenericVectorBuilder.Engines/Sinks/ElasticsearchSinkOptions.cs#int NumCandidates = 100
elasticsearchindex20261007-205106-eshoponweb1 shard, 0 replicas;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/ElasticsearchSink.cs#settings = new { number_of_shards = 1, number_of_replicas = 0 }
elasticsearchindex20261007-205106-eshoponwebforce-merged to one segment after the loadread-backyes
  • results:targets[elasticsearch].load.indexNote#1 segment(s), 524 vectors
elasticsearchindex20261007-205106-eshoponweb(at 1,024 dimensions a segment under 1,043 vectors gets no graph)unverifiedyes-
sqlindex20261007-205106-eshoponwebexact VECTOR_DISTANCE cosine, no vector index (full scan)documentedyes
  • src/GenericVectorBuilder.Bench/Targets/TargetFactory.cs#private const string SQL_EXACT_INDEX = "exact VECTOR_DISTANCE cosine, no vector index (full scan)"
pgvectorindex20261007-205106-eshoponwebHNSW vector_cosine_ops m=16 ef_construction=128,read-backyes
  • results:targets[pgvector].load.indexNote#USING hnsw (embedding vector_cosine_ops) WITH (m='16', ef_construction='128')
pgvectorindex20261007-205106-eshoponwebhnsw.ef_search=100 per query,documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/PgVectorSink.cs#SET LOCAL hnsw.ef_search =
  • src/GenericVectorBuilder.Engines/Sinks/PgVectorSinkOptions.cs#public int HnswEfSearch { get; set; } = 100;
pgvectorindex20261007-205106-eshoponwebfloat32 vector(n), cosine;unverifiedyes-
pgvectorindex20261007-205106-eshoponwebexact mode = same query with index scans off (sequential scan)documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/PgVectorSink.cs#EXACT_SETTINGS = "SET LOCAL enable_indexscan = off; SET LOCAL jit = off"
sqlitevecindex20261007-205106-eshoponwebvec0 brute-force scan, no ANN index (exact),read-backyes
  • results:targets[sqlitevec].load.indexNote#EXPLAIN QUERY PLAN: SCAN
sqlitevecindex20261007-205106-eshoponwebfloat32, cosine distance,documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/SqliteVecSink.cs#embedding float[{dimension}] distance_metric=cosine,
sqlitevecindex20261007-205106-eshoponwebdefault chunk_size=1024; score = 1 - cosine distance;unverifiedyes-
sqlitevecindex20261007-205106-eshoponwebsearches run concurrently, one WAL reader connection per searcher (opened as searchers arrive, at most 32), writes run one at a time and may overlap searchesdocumentedyes
  • src/GenericVectorBuilder.Engines/Sinks/SqliteVecSinkOptions.cs#public int MaxSearchConnections { get; set; } = 32;
  • src/GenericVectorBuilder.Engines/Sinks/SqliteVecSink.cs#return Math.Max( MIN_SEARCH_CONNECTIONS, _options.MaxSearchConnections );
qdrantindex20261007-205106-eshoponwebexact scan: the builder's sink sends exact=true on every search,documentedyes
  • src/GenericVectorBuilder.Bench/Targets/TargetFactory.cs#private const string QDRANT_EXACT_INDEX = "exact scan: the builder's sink sends exact=true on every search
qdrantindex20261007-205106-eshoponwebso no HNSW graph is used whether or not Qdrant has built one (see the index state)read-backyes
  • results:targets[qdrant].load.indexNote#0 of 524 vectors in HNSW segments
opensearchindex20261007-205106-eshoponwebfaiss HNSW float32, no compression, m=16, ef_construction=128, cosinesimil;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/OpenSearchSink.cs#parameters = new { m = HNSW_M, ef_construction = HNSW_EF_CONSTRUCTION }
  • src/GenericVectorBuilder.Engines/Sinks/OpenSearchSink.cs#private const int HNSW_M = 16;
  • src/GenericVectorBuilder.Engines/Sinks/OpenSearchSink.cs#private const int HNSW_EF_CONSTRUCTION = 128;
opensearchindex20261007-205106-eshoponwebsearch k=top, ef_search=100;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/OpenSearchSink.cs#method_parameters = new { ef_search = Math.Max( _options.EfSearch, top ) }
  • src/GenericVectorBuilder.Engines/Sinks/OpenSearchSinkOptions.cs#int EfSearch = 100
opensearchindex20261007-205106-eshoponweb1 shard, 0 replicas;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/OpenSearchSink.cs#["number_of_shards"] = 1, ["number_of_replicas"] = 0
opensearchindex20261007-205106-eshoponwebgraph built at any segment size (approximate_threshold=0);read-backyes
  • results:targets[opensearch].load.indexNote#approximate_threshold 0
opensearchindex20261007-205106-eshoponwebforce-merged to one segment after the loadread-backyes
  • results:targets[opensearch].load.indexNote#force-merged to one segment
qdrant-hnswindex20261007-205106-eshoponwebHNSW m=16 ef_construct=100,documentedyes
  • src/GenericVectorBuilder.Bench/Targets/QdrantHnswSink.cs#var hnsw = new HnswConfigDiff { M = HNSW_M, EfConstruct = HNSW_EF_CONSTRUCT, FullScanThreshold = FULL_SCAN_THRESHOLD_KB };
qdrant-hnswindex20261007-205106-eshoponwebhnsw_ef=server default,documentedyes
  • src/GenericVectorBuilder.Bench/Targets/QdrantHnswSink.cs#search.HnswEf = _ef.Value;
qdrant-hnswindex20261007-205106-eshoponwebcosine;documentedyes
  • src/GenericVectorBuilder.Bench/Targets/QdrantHnswSink.cs#new VectorParams { Size = (ulong)dimension, Distance = Distance.Cosine }
qdrant-hnswindex20261007-205106-eshoponwebindexing_threshold_kb 1 and full_scan_threshold_kb 10documentedyes
  • src/GenericVectorBuilder.Bench/Targets/QdrantHnswSink.cs#var optimizers = new OptimizersConfigDiff { IndexingThreshold = INDEXING_THRESHOLD_KB };
  • src/GenericVectorBuilder.Bench/Targets/QdrantHnswSink.cs#var hnsw = new HnswConfigDiff { M = HNSW_M, EfConstruct = HNSW_EF_CONSTRUCT, FullScanThreshold = FULL_SCAN_THRESHOLD_KB };
qdrant-hnswindex20261007-205106-eshoponweb(server defaults are 10,000 each)read-backyes
  • results:targets[qdrant-hnsw].durability#storage.optimizers.indexing_threshold_kb = 10000
  • results:targets[qdrant-hnsw].durability#storage.hnsw_index.full_scan_threshold_kb = 10000
qdrant-hnswindex20261007-205106-eshoponwebso a small collection builds and walks its graphread-backyes
  • results:targets[qdrant-hnsw].load.indexNote#524 of 524 vectors in HNSW segments
redisindex20261007-205106-eshoponwebHNSW TYPE FLOAT32 M=16 EF_CONSTRUCTION=128,documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/RedisSink.cs#["M"] = _options.HnswM,
  • src/GenericVectorBuilder.Engines/Sinks/RedisSink.cs#["EF_CONSTRUCTION"] = _options.HnswEfConstruction,
  • src/GenericVectorBuilder.Engines/Sinks/RedisSinkOptions.cs#public int HnswM { get; set; } = 16;
  • src/GenericVectorBuilder.Engines/Sinks/RedisSinkOptions.cs#public int HnswEfConstruction { get; set; } = 128;
redisindex20261007-205106-eshoponwebEF_RUNTIME=100 per query,documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/RedisSink.cs#$"EF_RUNTIME {Math.Max( _options.HnswEfRuntime, top )}"
  • src/GenericVectorBuilder.Engines/Sinks/RedisSinkOptions.cs#public int HnswEfRuntime { get; set; } = 100;
redisindex20261007-205106-eshoponwebcosine;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/RedisSink.cs#["DISTANCE_METRIC"] = "COSINE",
redisindex20261007-205106-eshoponwebexact mode = FLAT index built on first exact queryunverifiedyes-
milvusindex20261007-205106-eshoponwebHNSW M=16 efConstruction=128,read-backyes
  • results:targets[milvus].load.indexNote#type HNSW (COSINE, {"M":16,"efConstruction":128})
milvusindex20261007-205106-eshoponwebef=100, metric COSINE,documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#writer.WriteNumber( "ef", _options.Ef.Value );
  • src/GenericVectorBuilder.Engines/Sinks/MilvusSinkOptions.cs#int? Ef = 100,
  • src/GenericVectorBuilder.Engines/Sinks/MilvusSink.cs#["metricType"] = "COSINE",
milvusindex20261007-205106-eshoponwebStrong consistency searches;unverifiedyes-
milvusindex20261007-205106-eshoponwebapproximate only (no exact mode)unverifiedyes-
mariadbindex20261007-205106-eshoponwebVECTOR INDEXdocumentedyes
  • src/GenericVectorBuilder.Engines/Sinks/MariaDbSink.cs#VECTOR INDEX {INDEX_NAME} ( embedding ) M={_options.HnswM} DISTANCE=cosine
mariadbindex20261007-205106-eshoponweb(HNSW variant)unverifiedyes-
mariadbindex20261007-205106-eshoponwebDISTANCE=cosine, M=16documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/MariaDbSink.cs#VECTOR INDEX {INDEX_NAME} ( embedding ) M={_options.HnswM} DISTANCE=cosine
  • src/GenericVectorBuilder.Engines/Sinks/MariaDbSinkOptions.cs#public int HnswM { get; set; } = 16;
mariadbindex20261007-205106-eshoponweb(no ef_construction setting exists),unverifiedyes-
mariadbindex20261007-205106-eshoponwebrecall@10 at ef 100 fall...unverifiedno (mariadb-recall)-
mariadbindex20261007-205106-eshoponwebmhnsw_max_cache_size 4G;documentedyes
  • deploy/engines/mariadb-bench.compose.yaml#--mhnsw-max-cache-size=4G
  • design/bench-inputs/mariadb-effort-2026-10-07/run.log#SETTING mhnsw_max_cache_size = 4294967296
mariadbindex20261007-205106-eshoponwebexact mode = IGNORE INDEX full scandocumentedyes
  • src/GenericVectorBuilder.Engines/Sinks/MariaDbSink.cs#SearchSql( collection, top, $"IGNORE INDEX ( {INDEX_NAME} )" )
weaviatedurability20261007-205106-eshoponwebWeaviate 1.39.8 defaults...unverifiedno (contradicted)-
weaviateindex20261007-205106-eshoponwebHNSW maxConnections(M)=16 efConstruction=128,documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#["maxConnections"] = _options.MaxConnections,
  • src/GenericVectorBuilder.Engines/Sinks/WeaviateSink.cs#["efConstruction"] = _options.EfConstruction,
  • src/GenericVectorBuilder.Engines/Sinks/WeaviateSinkOptions.cs#int MaxConnections = 16,
  • src/GenericVectorBuilder.Engines/Sinks/WeaviateSinkOptions.cs#int EfConstruction = 128,
weaviateindex20261007-205106-eshoponweb(dynamic: limit x 8 clamped 100..500),documentedyes
  • design/engine-docs/weaviate-vector-index-reference-2026-10-07.mdx#`dynamicEfFactor`
  • design/engine-docs/weaviate-vector-index-reference-2026-10-07.mdx#`dynamicEfMin`
  • design/engine-docs/weaviate-vector-index-reference-2026-10-07.mdx#`dynamicEfMax`
  • design/engine-docs/weaviate-vector-index-concepts-2026-10-07.md#The dynamic list size will be set as the query limit multiplied by `dynamicEfFactor`, modified by a minimum of `dynamicEfMin` and a maximum of `dynamicEfMax`.
weaviateindex20261007-205106-eshoponwebcosine, no quantization;unverifiedyes-
weaviateindex20261007-205106-eshoponwebapproximate only (no exact mode)unverifiedyes-
mongodbindex20261007-205106-eshoponwebvectorSearch index, HNSW maxEdges=16 numEdgeCandidates=128,documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/MongoDbSinkOptions.cs#public int HnswMaxEdges { get; set; } = 16;
  • src/GenericVectorBuilder.Engines/Sinks/MongoDbSinkOptions.cs#public int HnswNumEdgeCandidates { get; set; } = 128;
mongodbindex20261007-205106-eshoponwebfloat32 binData, cosine,documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/MongoDbSink.cs#VectorSimilarity.Cosine
mongodbindex20261007-205106-eshoponwebnumCandidates=20x hits (min 100);documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/MongoDbSinkOptions.cs#public int NumCandidatesFactor { get; set; } = 20;
  • src/GenericVectorBuilder.Engines/Sinks/MongoDbSinkOptions.cs#public int MinNumCandidates { get; set; } = 100;
mongodbindex20261007-205106-eshoponwebexact mode = $vectorSearch exact:trueunverifiedyes-
chromaindex20261007-205106-eshoponwebHNSW M=16 ef_construction=128, ef_search=100documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#["max_neighbors"] = _options.MaxNeighbors,
  • src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#["ef_construction"] = _options.EfConstruction,
  • src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#["ef_search"] = _options.EfSearch,
  • src/GenericVectorBuilder.Engines/Sinks/ChromaSinkOptions.cs#int MaxNeighbors = 16,
  • src/GenericVectorBuilder.Engines/Sinks/ChromaSinkOptions.cs#int EfConstruction = 128,
  • src/GenericVectorBuilder.Engines/Sinks/ChromaSinkOptions.cs#int EfSearch = 100 );
chromaindex20261007-205106-eshoponweb(Chroma default),unverifiedyes-
chromaindex20261007-205106-eshoponwebcosine;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/ChromaSink.cs#["space"] = "cosine",
chromaindex20261007-205106-eshoponwebapproximate only (no exact mode)unverifiedyes-
typesenseindex20261007-205106-eshoponwebHNSW float32 (hnswlib), m=16, ef_construction=128, cosine;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/TypesenseSink.cs#hnsw_params = new { M = HNSW_M, ef_construction = HNSW_EF_CONSTRUCTION }
  • src/GenericVectorBuilder.Engines/Sinks/TypesenseSink.cs#private const int HNSW_M = 16;
  • src/GenericVectorBuilder.Engines/Sinks/TypesenseSink.cs#private const int HNSW_EF_CONSTRUCTION = 128;
typesenseindex20261007-205106-eshoponwebsearch k=top, ef=100;documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/TypesenseSink.cs#string options = $"k:{top}, ef:{Math.Max( _options.Ef, top )}";
  • src/GenericVectorBuilder.Engines/Sinks/TypesenseSinkOptions.cs#int Ef = 100
typesenseindex20261007-205106-eshoponwebexact mode = filter ordinal:>=0 with flat_search_cutoff;unverifiedyes-
typesenseindex20261007-205106-eshoponwebindex held in memoryunverifiedyes-
sql-diskannindex20261007-205106-eshoponwebDiskANN (preview) via VECTOR_SEARCH, cosine,unverifiedyes-
sql-diskannindex20261007-205106-eshoponwebbuild {"StartId":"306", "L":"48", "M":"8", "R":"48"};read-backyes
  • results:targets[sql-diskann].load.indexNote#built DiskANN, parameters {"StartId":"306", "L":"48", "M":"8", "R":"48"}
  • src/GenericVectorBuilder.Bench/Targets/SqlDiskAnnSink.cs#_buildParameters = index?.Build ?? "unknown";
sql-diskannindex20261007-205106-eshoponwebthe exact mode scans the same tableunverifiedyes-
duckdbindex20261007-205106-eshoponwebHNSW (vss extension) FLOAT[n] metric=cosine m=16 ef_construction=128,documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs#WITH ( metric = 'cosine', m =
  • src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs#Run( connection, "LOAD vss;" )
  • src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs#{VECTOR_COLUMN} FLOAT[{dimension.ToString( CultureInfo.InvariantCulture )}] NOT NULL );
  • src/GenericVectorBuilder.Engines/Sinks/DuckDbSinkOptions.cs#public int HnswM { get; set; } = 16;
  • src/GenericVectorBuilder.Engines/Sinks/DuckDbSinkOptions.cs#public int HnswEfConstruction { get; set; } = 128;
duckdbindex20261007-205106-eshoponwebef_search=100 per connection,documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs#SET hnsw_ef_search
  • src/GenericVectorBuilder.Engines/Sinks/DuckDbSinkOptions.cs#public int HnswEfSearch { get; set; } = 100;
duckdbindex20261007-205106-eshoponwebpersistent (hnsw_enable_experimental_persistence=true, checkpoint_threshold=256MB);documentedyes
  • src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs#SET hnsw_enable_experimental_persistence = true;
  • src/GenericVectorBuilder.Engines/Sinks/DuckDbSink.cs#SET checkpoint_threshold
  • src/GenericVectorBuilder.Engines/Sinks/DuckDbSinkOptions.cs#public string CheckpointThreshold { get; set; } = "256MB";
duckdbindex20261007-205106-eshoponwebexact mode = array_cosine_similarity sequential scan;unverifiedyes-
duckdbindex20261007-205106-eshoponwebscore = 1 - cosine distance;unverifiedyes-
duckdbindex20261007-205106-eshoponwebsearches run concurrently, one connection per searcher (opened as searchers arrive, at most 32), writes run one at a time and never overlap a searchunverifiedyes-
-notes 1220261007-205106-eshoponwebthe native comparison ta...unverifiedno (absent-targets)-
-notes 1320261007-205106-eshoponwebfor the native compariso...unverifiedno (absent-targets)-
-notes 1620261007-205106-eshoponweb, so every CPU's clock i...unverifiedno (clock-held)-

Runs used

Runs used: 6 claim runs, which are among the 12 runs of the basis; each is listed below with its seed and start time.

sources
  • consolidated consolidated:claimRunCount = 6
  • consolidated consolidated:basis.runCount = 12

The runs of v7 were also used by the set blocked-2026-10-06-v7, which was not published; its verdict, design/verdicts/v7-verdict.md, holds the word BLOCK.

sources
  • file design/verdicts/v7-verdict.md#BLOCK = BLOCK
  • consolidated consolidated:reuse[session=v7].verdict = design/verdicts/v7-verdict.md
  • consolidated consolidated:reuse[session=v7].blockedFolders[0] = blocked-2026-10-06-v7

The runs of v5 were also used by the set blocked-2026-10-05-v5, which was not published; its verdict, design/verdicts/v5-verdict.txt, holds the word BLOCK.

sources
  • file design/verdicts/v5-verdict.txt#BLOCK = BLOCK
  • consolidated consolidated:reuse[session=v5].verdict = design/verdicts/v5-verdict.txt
  • consolidated consolidated:reuse[session=v5].blockedFolders[0] = blocked-2026-10-05-v5

The runs of v6 were also used by the set blocked-2026-10-05-v6, which was not published; its verdict, design/verdicts/v6-verdict.md, holds the word BLOCK.

sources
  • file design/verdicts/v6-verdict.md#BLOCK = BLOCK
  • consolidated consolidated:reuse[session=v6].verdict = design/verdicts/v6-verdict.md
  • consolidated consolidated:reuse[session=v6].blockedFolders[0] = blocked-2026-10-05-v6

The results.md of run 20261006-130619-eshoponweb holds a framing sentence this report retired, on line 13.

sources
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-130619-eshoponweb].staleLines[0].line = 13
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-130619-eshoponweb].folder = 20261006-130619-eshoponweb

The results.md of run 20261006-142724-eshoponweb holds a framing sentence this report retired, on line 13.

sources
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-142724-eshoponweb].staleLines[0].line = 13
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-142724-eshoponweb].folder = 20261006-142724-eshoponweb

The results.md of run 20261006-154837-eshoponweb holds a framing sentence this report retired, on line 13.

sources
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-154837-eshoponweb].staleLines[0].line = 13
  • consolidated consolidated:sessions[name=v7].runs[folder=20261006-154837-eshoponweb].folder = 20261006-154837-eshoponweb
SessionRunSeedStarted (UTC)results.json SHA-256
v720261006-130619-eshoponweb7012026-10-06T13:06:19Zdb2b2cacc7be
v720261006-142724-eshoponweb7022026-10-06T14:27:24Z10bafe1e141c
v720261006-154837-eshoponweb7032026-10-06T15:48:37Z11e136639abf
v820261007-205106-eshoponweb8012026-10-07T20:51:06Zf723e0233ced
v820261007-221429-eshoponweb8022026-10-07T22:14:29Z235eb74d0ddb
v820261007-233551-eshoponweb8032026-10-07T23:35:51Z64fd3d69b2dd
v5 (basis)20261005-023459-eshoponweb5012026-10-05T02:34:59Z7514dac7c2d8
v5 (basis)20261005-031556-eshoponweb5022026-10-05T03:15:56Z6e6671a431dc
v5 (basis)20261005-035711-eshoponweb5032026-10-05T03:57:11Z00914a96391a
v6 (basis)20261005-073329-eshoponweb6012026-10-05T07:33:29Z0e91f3990213
v6 (basis)20261005-085448-eshoponweb6022026-10-05T08:54:48Z044e47aa3574
v6 (basis)20261005-101815-eshoponweb6032026-10-05T10:18:15Z0e93a162a36d

The method, quoted from the notes of run 20261007-205106-eshoponweb:

sources
  • consolidated consolidated:sessions[name=v8].runs[folder=20261007-205106-eshoponweb].folder = 20261007-205106-eshoponweb

Read from the running engine or the machine by the benchmark's own code, as the cited line shows:

sources
  • file src/GenericVectorBuilder.Bench/Report/MachineFacts.cs#File.ReadAllText( "/proc/loadavg" ) = File.ReadAllText( "/proc/loadavg" )
Load average at start: 0.38 0.64 1.22 on 8 logical CPUs (1/5/15 min).
sources
  • quote results@20261007-205106-eshoponweb:notes[0]

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

It counts this benchmark's own earlier work and the engines it started, so it is recorded here and never judged; each timed pass is judged by the outside load machine control measures (conditions.passes).
sources
  • quote results@20261007-205106-eshoponweb:notes[0]

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file src/GenericVectorBuilder.Bench/Running/RunOrder.cs#return Shuffle( names, Mix( (ulong)(uint)runSeed ^ TARGET_SALT ) ); = return Shuffle( names, Mix( (ulong)(uint)runSeed ^ TARGET_SALT ) );
  • file src/GenericVectorBuilder.Bench/Running/RunOrder.cs#return Shuffle( passes, Mix( (ulong)(uint)runSeed ^ PASS_SALT ^ StableHash( targetName.ToLowerInvariant() ) ) ); = return Shuffle( passes, Mix( (ulong)(uint)runSeed ^ PASS_SALT ^ StableHash( targetName.ToLowerInvariant() ) ) );
Order: targets ran one at a time in a random order from seed 801 (runSeed; --seed 801 repeats it, targetOrder lists it).
sources
  • quote results@20261007-205106-eshoponweb:notes[1]
Inside each target the timed passes also ran in a random order from the same seed and the target's name (passOrder):
sources
  • quote results@20261007-205106-eshoponweb:notes[1]

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

default@1 is one searcher for 20 s (every search's latency gives p50/p95/p99, the completed searches give QPS@1, its first answer to each query gives recall and nDCG), default@N is N searchers for 20 s (QPS@N), exact is the engine's exact mode, one searcher for 60 s cycling the queries.
sources
  • quote results@20261007-205106-eshoponweb:notes[1]
Preparation, untimed, before any timed pass: a rehearsal of every pass type at its own concurrency for 30 s each, through the same code the passes use.
sources
  • quote results@20261007-205106-eshoponweb:notes[2]
Warm-up and settle check, untimed, right before every timed pass: the pass's own search at the pass's own number of searchers for at least 15 s and at least 20 searches (at most 120 s), read in windows of at least 2 s and 100 searches; then a 3 s trial of the same pass. The trial's figure (p50 with one searcher, QPS with several) must lie within 10% of the warm-up's settled figure (the median of its last 3 windows, which must agree within 5%); if not, the warm-up is extended once (at least 30 s, until its windows agree, at most 120 s), where an extension's windows agree when its level test passes: the older and the newer half of its latest windows, 5 to 10 windows a half, each half read as the pass reads it (the p50 of all its searches with one searcher, its searches per second with several), agree within 5%, judged on the windows that stopped it (an extension whose cap runs out with fewer than 10 windows is judged by its last 3 instead); then a second trial is taken, which must lie inside the range of the newer half's windows or within 10% of the newer half's figure, and the warm-up runs again before the pass. After the pass its own figure is held against the settled figure, within 10%. In the level test, the second trial and the hold, two one-searcher p50s no more than 0.1 ms apart agree whatever their percentage (below what this box resolves at one searcher). Each target's notes give every check, and a pass that still disagrees, or whose own figure did not hold, flags its target as unsettled. With machine control on, the check for a quiet box is made when the warm-up is announced, before it starts (a wait between the warm-up and the timed pass let the engine go cold), so by the time the clock opens that check is as old as the warm-up and the trial (about 18 s, more after an extension); each pass's conditions record that lead (quietCheckLeadSeconds). Failed untimed searches are counted per target (warmupErrors) and are not in the timed error counts.
sources
  • quote results@20261007-205106-eshoponweb:notes[3]
Load rows/s counts only time inside each target's upsert calls: one writer, batches of 1000, rows already in memory, the collection dropped and created fresh first. Engines that build or finish their index after the writes do it in a separate timed index step (the load's index seconds), and the run waits for it before searching.
sources
  • quote results@20261007-205106-eshoponweb:notes[4]
Index proof: each engine's own report of its index (indexState) is read after the load and again after the last pass. A target whose index was not ready after the load was still measured and carries a WARNING; an engine that reports nothing counts as not ready.
sources
  • quote results@20261007-205106-eshoponweb:notes[5]
Search settings: each searched target records the settings its own index description states (searchSettings: the build parameters and the effort per query, such as m, ef_construction and ef_search), read after the load; consolidating never averages runs whose settings differ.
sources
  • quote results@20261007-205106-eshoponweb:notes[6]
Durability: each target's crash-safety setting as configured here (durability). Engines that do not force writes to disk on every commit load faster for that reason.
sources
  • quote results@20261007-205106-eshoponweb:notes[7]
Engine record: right after each engine was bound, its settings (engineSettings: the container's limits and what the engine itself reports, each entry saying how it was obtained), its image against the id pinned in deploy/bench/image-pins.json (image; another id ends that target with an error) and the size of its data folder (dataFolder: at the start, after any reset, and at the end) were recorded. In run-all, ClickHouse's system log tables are truncated before its load, and the reset is written into its dataFolder.
sources
  • quote results@20261007-205106-eshoponweb:notes[8]
Latency is client-side wall time around each search (network and driver included), every search of the default@1 window, one searcher, the queries cycled; a window with fewer than 200 searches, a p50 above 1.25 x its mean, or a mean above its p99 is flagged.
sources
  • quote results@20261007-205106-eshoponweb:notes[9]
QPS: N searchers back to back for 20 s per level; completed searches divided by the window's elapsed time.
sources
  • quote results@20261007-205106-eshoponweb:notes[10]
Recall@10: share of the exact top 10 (brute force in memory) that the engine returned.
sources
  • quote results@20261007-205106-eshoponweb:notes[11]

Set by a line of code or a compose file saved in this repository, not read back from the engine:

sources
  • file src/GenericVectorBuilder.Bench/Stats/BenchMath.cs#public const double TIE_TOLERANCE = 1e-5; = public const double TIE_TOLERANCE = 1e-5;
A hit whose exact similarity ties the 10th best (within 1e-5) also counts
sources
  • quote results@20261007-205106-eshoponweb:notes[11]

A saved check of this data found 0 pairs of rows within 1e-5 of identical, and 0 of 20 queries with a row outside the exact top 10 that the tie rule would count.

sources
  • file design/bench-inputs/tie-check-eshoponweb-2026-10-07.json#"duplicatePairs": 0 = "duplicatePairs": 0
  • file design/bench-inputs/tie-check-eshoponweb-2026-10-07.json#"queriesWithRowsOutsideTopKWithinEpsilon": 0 = "queriesWithRowsOutsideTopKWithinEpsilon": 0
  • file design/bench-inputs/tie-check-eshoponweb-2026-10-07.json#"queries": 20 = "queries": 20
  • file design/bench-inputs/tie-check-eshoponweb-2026-10-07.json#"top": 10 = "top": 10
  • results results@20261007-205106-eshoponweb:notes[11]#within 1e-5 = within 1e-5

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

, because duplicate rows embed to identical vectors.
sources
  • quote results@20261007-205106-eshoponweb:notes[11]

Read back in these runs from the engine or the machine:

sources
  • results results:conditions.connections#this target = this target
Routes: a container engine (the benchmark's own SQL Server and Qdrant containers included) is reached at its container's own address on its Docker network, never through the published localhost port (docker-proxy);
sources
  • quote results@20261007-205106-eshoponweb:notes[12]

A clause of this note names sql-native and qdrant-native, which are not targets of this report, so it is not printed.

sources
  • results results@20261007-205106-eshoponweb:notes[12]#sql-native = sql-native
  • results results@20261007-205106-eshoponweb:notes[12]#qdrant-native = qdrant-native

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

Each target's addresses and the connections the client held open after its passes are in its notes and in conditions.connections.
sources
  • quote results@20261007-205106-eshoponweb:notes[12]
RAM of compose engines, the benchmark's own SQL Server and Qdrant containers (sql, sql-diskann, qdrant, qdrant-hnsw) included, is docker stats of the engine's containers;
sources
  • quote results@20261007-205106-eshoponweb:notes[13]

A clause of this note names sql-native and qdrant-native, which are not targets of this report, so it is not printed.

sources
  • results results@20261007-205106-eshoponweb:notes[13]#sql-native = sql-native
  • results results@20261007-205106-eshoponweb:notes[13]#qdrant-native = qdrant-native

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

Disk is the table's reserved pages (SQL), the collection folder (Qdrant), or for other engines what the load added to the engine's data folder (engines that keep data in memory until a snapshot show almost nothing); when the folder was smaller after the load than before it, no figure is given.
sources
  • quote results@20261007-205106-eshoponweb:notes[13]
Engines: run-all starts an engine that is down and stops it afterwards only if it was not running when the run began; an engine that was already running is left running.
sources
  • quote results@20261007-205106-eshoponweb:notes[14]

Read back in these runs from the engine or the machine:

sources
  • results results:conditions.governor#performance = performance
  • results results:conditions.clientCpus#0-1,4-5 = 0-1,4-5
  • results results:conditions.engineCpus#2-3,6-7 = 2-3,6-7
Machine control on: governor performance on every CPU during the run (before: schedutil; at the end: performance; after putting it back: schedutil). CPU clock pinned for the run: turbo off (intel_pstate/no_turbo 0 -> 1)
sources
  • quote results@20261007-205106-eshoponweb:notes[16]

A clause of the machine control note, that every CPU's clock is held at its ceiling for any engine, is not printed: the observer found oracle's eight-searcher pass 0.27% to 0.66% under the pin.

sources
  • results results@20261007-205106-eshoponweb:notes[16]#so every CPU's clock is held at its ceiling of = so every CPU's clock is held at its ceiling of
  • consolidated consolidated:observer.dip.target = oracle
  • consolidated consolidated:observer.dip.minBp|bp-pct = 0.27
  • consolidated consolidated:observer.dip.maxBp|bp-pct = 0.66

Read back in these runs from the engine or the machine:

sources
  • results results:conditions.governor#performance = performance
  • results results:conditions.clientCpus#0-1,4-5 = 0-1,4-5
  • results results:conditions.engineCpus#2-3,6-7 = 2-3,6-7
the uncore (L3 and memory) clock is held at 3000 MHz (min 3000 MHz, max 3000 MHz (MSR 0x620 = 0x1e1e); was min 1200 MHz, max 3000 MHz (MSR 0x620 = 0xc1e)) (before: turbo on (intel_pstate/no_turbo 0), ceiling 3600 MHz on CPUs 0-7, floor 1200 MHz on CPUs 0-7; while pinned: turbo off (intel_pstate/no_turbo 1), ceiling 3500 MHz on CPUs 0-7, floor 1200 MHz on CPUs 0-7; at the end: turbo off (intel_pstate/no_turbo 1), ceiling 3500 MHz on CPUs 0-7, floor 1200 MHz on CPUs 0-7; after putting it back: turbo on (intel_pstate/no_turbo 0), ceiling 3600 MHz on CPUs 0-7, floor 1200 MHz on CPUs 0-7). Uncore limit at the end: min 3000 MHz, max 3000 MHz (MSR 0x620 = 0x1e1e); after putting it back: min 1200 MHz, max 3000 MHz (MSR 0x620 = 0xc1e). Each target's clock note gives every pass's median MHz on the engine CPUs and on the client CPUs (the median of each CPU's median); a pass whose median on either is more than 100 bp (1%) off the pinned 3500 MHz, or that has no reading on one, is flagged (conditions.clock.rule). Figures from runs made with turbo on are not comparable with these in absolute terms. engine CPUs 2-3,6-7 (cores 2,6 and 3,7), client CPUs 0-1,4-5 (cores 0,4 and 1,5); the client process was pinned; each engine was pinned to the engine CPUs for its turn and put back after (conditions.engines); an engine run-all started (and stopped) was asked to be created on them, and its notes say whether the host did so or it was moved there after the start.
sources
  • quote results@20261007-205106-eshoponweb:notes[16]

Typed in the program's own text; not read back, measured or backed by a saved source:

no sources recorded

Busy box: right before each pass's warm-up the run waits, up to 10 min, while processes outside the benchmark (everything but this client and the engine under test's cgroups) use more than 0.3 CPUs on average over the last 60 s or the last 5 s, neither window reaching back past the start of the target or of its engine (so the engine's own start-up is not outside work); if the box does not clear the pass runs anyway, flagged 'busy box', as is a pass whose own outside load is above the limit. Outside load counts busy = user + nice + system + irq + softirq + steal (guest time is already in user); CONFIG_IRQ_TIME_ACCOUNTING is not set, so task and cgroup run time include the interrupt and softirq time that hit them and it is added; CONFIG_PARAVIRT_TIME_ACCOUNTING is not set, so steal is added (/boot/config-6.8.0-142-generic) (conditions.cpuAccounting); each pass also records this client's own CPU time per search and the engine's (conditions.passes[].clientCpuMsPerSearch and engineCpuMsPerSearch; how in conditions.engineCpu.rule). CPU clocks were sampled every 250 ms; each pass's min/median/max per CPU is in conditions.passes. CPU idle states, recorded and left as found: driver intel_idle, governor menu, intel_idle max_cstate 9; POLL on, C1 on, C1E on, C3 OFF on CPUs 0-7 (default disabled), C6 on (conditions.cpuIdle). How each target was reached: conditions.connections. Client build Release, .NET 10.0.12.
sources
  • quote results@20261007-205106-eshoponweb:notes[16]

Read back in these runs from the engine or the machine:

sources
  • results results:conditions.engines#embedded = embedded
duckdb is embedded: it ran inside the client process on the client CPUs 0-1,4-5, sharing them with the client.
sources
  • quote results@20261007-205106-eshoponweb:notes[17]

Read back in these runs from the engine or the machine:

sources
  • results results:conditions.engines#embedded = embedded
sqlitevec is embedded: it ran inside the client process on the client CPUs 0-1,4-5, sharing them with the client.
sources
  • quote results@20261007-205106-eshoponweb:notes[18]

Text as the tool recorded it. Its figures were not re-derived for this report.

Audit
  • Sentences checked 523
  • Facts file SHA-256 74e8debc9d9f7617433290b3aa4c2dc65f2acafe19dad752d77418d084e20a9e
  • Exclusions file SHA-256 d676e39775d262b8fafd7353386aae87a726499bf9eb6763f91493890ca98075
  • Observer summary SHA-256 b9e1c73770f297059d2f52de76ebc17f4a8cae34f2b9afe04f2606230ce67f3c
  • Facts checked 116
  • Row sentences checked 87

All runs

When (UTC)DataEnginesQueriesUsed by
8 Oct 2026Published medians of 6 runs19--
4 Oct 2026Withdrawn medians, older format (not the current result)19--
6 Oct 2026Blocked medians, older format (marked blocked; not published)19--
5 Oct 2026Blocked medians, older format (marked blocked; not published)19--
5 Oct 2026Blocked medians, older format (marked blocked; not published)18--
7 Oct 2026, 23:35eShopOnWeb, 524 vectors1920 labelled questionspublished-2026-10-08 (v8, basis)
7 Oct 2026, 22:14eShopOnWeb, 524 vectors1920 labelled questionspublished-2026-10-08 (v8, basis)
7 Oct 2026, 20:51eShopOnWeb, 524 vectors1920 labelled questionspublished-2026-10-08 (v8, basis)
6 Oct 2026, 15:48eShopOnWeb, 524 vectors1920 labelled questionspublished-2026-10-08 (v7, basis)
6 Oct 2026, 14:27eShopOnWeb, 524 vectors1920 labelled questionspublished-2026-10-08 (v7, basis)
6 Oct 2026, 13:06eShopOnWeb, 524 vectors1920 labelled questionspublished-2026-10-08 (v7, basis)
5 Oct 2026, 10:18eShopOnWeb, 524 vectors1920 labelled questionspublished-2026-10-08 (basis v6)
5 Oct 2026, 08:54eShopOnWeb, 524 vectors1920 labelled questionspublished-2026-10-08 (basis v6)
5 Oct 2026, 07:33eShopOnWeb, 524 vectors1920 labelled questionspublished-2026-10-08 (basis v6)
5 Oct 2026, 03:57eShopOnWeb, 524 vectors1920 labelled questionspublished-2026-10-08 (basis v5)
5 Oct 2026, 03:15eShopOnWeb, 524 vectors1920 labelled questionspublished-2026-10-08 (basis v5)
5 Oct 2026, 02:34eShopOnWeb, 524 vectors1920 labelled questionspublished-2026-10-08 (basis v5)
4 Oct 2026, 13:27eShopOnWeb, 524 vectors1920 labelled questions-
4 Oct 2026, 13:08eShopOnWeb, 524 vectors1920 labelled questions-
3 Oct 2026, 23:48eShopOnWeb, 524 vectors420 labelled questions-
3 Oct 2026, 18:44eShopOnWeb, 524 vectors1820 labelled questions-
3 Oct 2026, 18:42eShopOnWeb, 524 vectors3200 random stored vectors-
3 Oct 2026, 18:39eShopOnWeb, 524 vectors320 labelled questions-
3 Oct 2026, 15:15AdventureWorks, 50,000 vectors4200 random stored vectors-
3 Oct 2026, 15:04AdventureWorks, 50,000 vectors3200 random stored vectors-