Questions
14 of 14
1What is a segment in Qdrant's storage engine, and why does a collection consist of multiple segments rather than one monolithic index?
2What role does the Write-Ahead Log (WAL) play in Qdrant, and what failure scenario does it protect against?
3How does memory-mapped (mmap) storage allow Qdrant to serve a collection larger than available RAM?
4What does the background optimizer do in Qdrant, and why can too-aggressive optimization affect query latency?
5What is the practical difference between storing vectors in-memory versus on-disk in a collection configuration, and when would you choose on-disk?
6What is sharding in a distributed Qdrant cluster, and what determines which shard a given point is written to by default?
7What is custom sharding, and how does it change the way multitenant data is distributed across a cluster?
8What consensus algorithm does Qdrant use to keep cluster metadata consistent across nodes, and what does it coordinate?
9What are Qdrant's tunable read/write consistency levels for distributed operations, and what trade-off do they represent?
10In a replicated cluster, what happens to search results if a query is served while one replica of a shard is temporarily out of sync?
11Walk through what happens internally, at a high level, when a client sends a filtered vector search request to a distributed Qdrant cluster.
12Why does Qdrant merge and re-rank results from multiple shards rather than simply concatenating each shard's top-k?
13How does a payload filter interact with segment selection during query execution - does Qdrant always scan every segment?
14What is the performance implication of running a query that touches every named vector on a point versus one that specifies using?
14 / 14

What is the performance implication of running a query that touches every named vector on a point versus one that specifies using?

Specifying using narrows the search to one index; omitting it multiplies the work

When a collection has multiple named vectors, a query that specifies using="field" searches only that field's index. A query that does not specify using is ambiguous: the engine either errors or, depending on the version and the collection shape, searches across all named vectors and merges the results. Searching all named vectors means running one HNSW traversal per field, plus a merge across fields, so the cost is roughly N times the cost of a single-field search plus the merge overhead. For a collection with three or four named vectors, that is a 3-4x cost multiplier on the search path, and it also fetches and scores vectors for fields you did not intend to query. Specifying using is therefore not just a convenience - it is a performance decision that determines how many graph traversals a single query triggers.

The mechanism is that each named vector has its own independent index. There is no shared structure between them, so searching all of them means traversing each graph separately. If the fields have different dimensions or distance metrics, the scores are not directly comparable, and merging them requires either a fusion step or a score normalization. If the fields have the same dimension and metric, the merge is a simple score sort, but the work is still N traversals. The practical guidance is to always specify using when the collection has more than one named vector, and to specify it in prefetch stages as well, because a prefetch without using is equally ambiguous. There is a related but different cost: touching every named vector for retrieval - for example, returning all vectors in the response via with_vectors=True - is a separate cost from searching them, and returning large multivectors in the payload can dominate the response size.

  1. 1

    Single named vector: using= can be omitted if the collection has only one unnamed vector.

  2. 2

    Multiple named vectors: using= must be specified, or the request is ambiguous and either errors or searches all fields.

  3. 3

    Cost multiplier: searching N named vectors means N HNSW traversals plus a merge, roughly N times the single-field cost.

  4. 4

    Prefetch stages: the same rule applies; a prefetch without using is ambiguous.

  5. 5

    Retrieval cost: with_vectors=True returns the vector payload, which is a separate cost from the search and can be large for multivectors.

The trade-off is flexibility against cost. Multi-vector collections let you model different aspects of a document (title, body, image) and query each independently or combine them, which is powerful. But each field has its own index, and querying all of them is expensive. The common mistake is copying a query example from a single-vector collection and forgetting to add using= when adapting it to a multi-vector collection, which either fails or silently searches every field and inflates latency. The second mistake is assuming that specifying using= changes the results semantically - it does not, it just picks which index to search; the results are the same as a single-field search, but faster. The third mistake is forgetting that with_vectors=True on a multivector field returns all token vectors in the response, which can be hundreds of vectors per point and dominate serialization time. Version note: the requirement to specify using on multi-vector collections, the exact error or fallback behavior when it is omitted, and the query_points API shape are all version-dependent; older clients may have different defaults for how an unspecified vector is handled.

javascript

Version-dependent: the behavior when using= is omitted on a multi-vector collection has changed across releases - some versions error, some search all fields, and the query_points API replaced the older search/search_batch calls in qdrant-client 1.10+. If you are porting code across versions, verify how the client handles an unspecified vector, and always set using= explicitly on multi-vector collections and on prefetch stages to avoid version-dependent ambiguity.

Difficulty: 6/10
Topics: Query Execution, Named Vectors, Performance Tuning

Scenario Questions

0-2 years experience
  1. 1

    You copy a query example from a single-vector tutorial into a multi-vector collection and it fails. Explain why and what you need to add.

  2. 2

    A teammate says specifying using= changes the ranking. Explain what it actually changes.

2-5 years experience
  1. 1

    Your multi-vector collection has three named vectors and p99 latency is 3x what you expected. Diagnose whether the query is searching all fields and how you would confirm it.

  2. 2

    You need to search two named vectors and combine the results. Explain how you would structure the query and the trade-off versus searching only one.

5-8 years experience
  1. 1

    Design a collection schema for a document search system with title, body, and summary embeddings, and specify how a query should be structured to search them without paying for unnecessary traversals.

  2. 2

    You have a multivector field and you call with_vectors=True in production and latency spikes. Explain the cause and how you would restructure the request.

8+ years experience
  1. 1

    Derive the cost of a query that searches N named vectors versus one, including the merge and score normalization overhead, and explain when a multi-field search is worth the cost.

  2. 2

    You are designing a query API for a multi-vector search system. Describe how you would expose field selection, defaults, and validation to prevent callers from accidentally triggering a full multi-field search.

Follow-up Questions

  • How would you decide how many named vectors a collection should have, given that each one adds an index and a potential search path?
  • If you have a collection with five named vectors and a query that genuinely needs to search all of them, how would you structure the request to minimize cost and produce a meaningful ranking?