mirror of
https://github.com/qdrant/landing_page.git
synced 2026-09-26 14:38:30 +02:00
* added a table of content * wide layout for docs, styles for the table of content * fixes for docs layout * wide footer at the docs section * added support for nested docs, added toggling groups of links, delimiters, external links * external link icon * added active state for nested links, styles for the external link icon * styles fix * remove doc sync * update directory structure and doc titles * fix outstanding links * fix more links for merge * Revert "fix more links for merge" This reverts commit 46c9ccaf1b7765f2cda8dc85d625fa6b4e3f5436. * Revert "fix outstanding links" This reverts commit 28e6380b74f1ab74690c8184551f186656d6d4e9. * fix remaining broken links * move how-to tutorials in the different page * split tutorials * fix link * upd github edit link * skip empty index pages --------- Co-authored-by: Andrey Vasnetsov <andrey@vasnetsov.com> Co-authored-by: David Sertic <62056091+davidmyriel@users.noreply.github.com>
94 lines
4.2 KiB
Markdown
94 lines
4.2 KiB
Markdown
---
|
|
title: Optimizer
|
|
weight: 70
|
|
---
|
|
|
|
# Optimizer
|
|
|
|
It is much more efficient to apply changes in batches than perform each change individually, as many other databases do. Qdrant here is no exception. Since Qdrant operates with data structures that are not always easy to change, it is sometimes necessary to rebuild those structures completely.
|
|
|
|
Storage optimization in Qdrant occurs at the segment level (see [storage](../storage)).
|
|
In this case, the segment to be optimized remains readable for the time of the rebuild.
|
|
|
|

|
|
|
|
The availability is achieved by wrapping the segment into a proxy that transparently handles data changes.
|
|
Changed data is placed in the copy-on-write segment, which has priority for retrieval and subsequent updates.
|
|
|
|
## Vacuum Optimizer
|
|
|
|
The simplest example of a case where you need to rebuild a segment repository is to remove points.
|
|
Like many other databases, Qdrant does not delete entries immediately after a query.
|
|
Instead, it marks records as deleted and ignores them for future queries.
|
|
|
|
This strategy allows us to minimize disk access - one of the slowest operations.
|
|
However, a side effect of this strategy is that, over time, deleted records accumulate, occupy memory and slow down the system.
|
|
|
|
To avoid these adverse effects, Vacuum Optimizer is used.
|
|
It is used if the segment has accumulated too many deleted records.
|
|
|
|
The criteria for starting the optimizer are defined in the configuration file.
|
|
|
|
Here is an example of parameter values:
|
|
|
|
```yaml
|
|
storage:
|
|
optimizers:
|
|
# The minimal fraction of deleted vectors in a segment, required to perform segment optimization
|
|
deleted_threshold: 0.2
|
|
# The minimal number of vectors in a segment, required to perform segment optimization
|
|
vacuum_min_vector_number: 1000
|
|
```
|
|
|
|
## Merge Optimizer
|
|
|
|
The service may require the creation of temporary segments.
|
|
Such segments, for example, are created as copy-on-write segments during optimization itself.
|
|
|
|
It is also essential to have at least one small segment that Qdrant will use to store frequently updated data.
|
|
On the other hand, too many small segments lead to suboptimal search performance.
|
|
|
|
There is the Merge Optimizer, which combines the smallest segments into one large segment. It is used if too many segments are created.
|
|
|
|
The criteria for starting the optimizer are defined in the configuration file.
|
|
|
|
Here is an example of parameter values:
|
|
|
|
```yaml
|
|
storage:
|
|
optimizers:
|
|
# If the number of segments exceeds this value, the optimizer will merge the smallest segments.
|
|
max_segment_number: 5
|
|
```
|
|
|
|
## Indexing Optimizer
|
|
|
|
Qdrant allows you to choose the type of indexes and data storage methods used depending on the number of records.
|
|
So, for example, if the number of points is less than 10000, using any index would be less efficient than a brute force scan.
|
|
|
|
The Indexing Optimizer is used to implement the enabling of indexes and mmap storage when the minimal amount of records is reached.
|
|
|
|
The criteria for starting the optimizer are defined in the configuration file.
|
|
|
|
Here is an example of parameter values:
|
|
|
|
```yaml
|
|
storage:
|
|
optimizers:
|
|
# Maximum size (in kilobytes) of vectors to store in-memory per segment.
|
|
# Segments larger than this threshold will be stored as read-only memmaped file.
|
|
# Memmap storage is disabled by default, to enable it, set this threshold to a reasonable value.
|
|
# To disable memmap storage, set this to `0`.
|
|
# Note: 1Kb = 1 vector of size 256
|
|
memmap_threshold_kb: 200000
|
|
|
|
# Maximum size (in kilobytes) of vectors allowed for plain index, exceeding this threshold will enable vector indexing
|
|
# Default value is 20,000, based on <https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md>.
|
|
# To disable vector indexing, set to `0`.
|
|
# Note: 1kB = 1 vector of size 256.
|
|
indexing_threshold_kb: 20000
|
|
```
|
|
|
|
In addition to the configuration file, you can also set optimizer parameters separately for each [collection](../collections).
|
|
|
|
Dynamic parameter updates may be useful, for example, for more efficient initial loading of points. You can disable indexing during the upload process with these settings and enable it immediately after it is finished. As a result, you will not waste extra computation resources on rebuilding the index. |