---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.4
alternate:
  - https://ydb.tech/docs/en/concepts/query_execution/spilling.md
  - https://ydb.tech/docs/ru/concepts/query_execution/spilling.md
sourcePath: ru/core/concepts/query_execution/spilling.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

# Спиллинг

## Спиллинг в общем

**Спиллинг** — это механизм управления памятью, при котором промежуточные данные, возникающие в результате выполнения запросов и превышающие доступный объём оперативной памяти узла, временно выгружаются во внешнее хранилище. В YDB для спиллинга в настоящее время используется диск. Спиллинг обеспечивает выполнение пользовательских запросов, которые требуют обработки больших объёмов данных, превышающих доступную память узла.

В системах обработки данных, включая YDB, спиллинг важен для:

- обработки запросов с большими объёмами данных, когда промежуточные результаты не помещаются в оперативную память;
- выполнения сложных аналитических операций (агрегации, соединения таблиц) над большими наборами данных;
- оптимизации производительности запросов за счет промежуточной материализации части данных во внешней памяти, что в определенных сценариях может ускорить общее время выполнения.

Спиллинг функционирует на основе принципа иерархии памяти:

1. **Оперативная память (RAM)** — быстрый, но ограниченный ресурс.
2. **Внешняя память** — медленнее, но более ёмкая.

Когда использование памяти приближается к лимиту, система:

- сериализует часть данных;
- сохраняет их во внешней памяти;
- освобождает соответствующую память;
- продолжает обработку запроса, используя данные, находящиеся в памяти;
- при необходимости загружает данные обратно в память для продолжения вычислений.


## Спиллинг в YDB {#architecture}

YDB реализует механизм спиллинга через **Spilling Service** — [акторный сервис](https://ydb.tech/docs/ru/concepts/glossary.md#actor-service), который предоставляет временное хранилище для блобов данных. Спиллинг осуществляется только на [узлах базы данных](https://ydb.tech/docs/ru/concepts/glossary.md#database-node). Подробная техническая информация о Spilling Service доступна в разделе [Spilling Service](https://ydb.tech/docs/ru/contributor/spilling-service.md).

### Типы спиллинга в YDB

YDB реализует два основных типа спиллинга, функционирующие на различных уровнях вычислительного процесса:

* [Спиллинг в вычислениях](#computation-spilling)
* [Спиллинг в транспорте](#transport-spilling)

Эти типы работают независимо друг от друга и могут активироваться одновременно в рамках одного запроса, обеспечивая комплексное управление памятью.

#### Спиллинг в вычислениях {#computation-spilling}

Вычислительные ядра YDB автоматически выгружают промежуточные данные на диск при выполнении операций, требующих значительного объема памяти. Данный тип спиллинга реализован на уровне отдельных вычислительных операций и активируется при достижении лимитов памяти.

**Основные сценарии использования:**

* **Агрегации** — при группировке больших объемов данных система выгружает промежуточные хеш-таблицы на диск

* **Join операции** — при объединении таблиц большого размера используется алгоритм Grace Hash Join с разделением данных на партиции и их выгрузкой на диск

##### Механизм функционирования

Вычислительные узлы содержат специализированные объекты для мониторинга использования памяти. При приближении объема данных к установленному лимиту:

1. Система переключается в режим спиллинга
2. Данные сериализуются и разделяются на блоки (бакеты)
3. Часть блоков передается в Spilling Service для сохранения на диске
4. В памяти сохраняется метаинформация о расположении данных
5. Система продолжает обработку данных, оставшихся в памяти, что позволяет освободить дополнительное место
6. При необходимости данные загружаются обратно и обрабатываются

#### Спиллинг в транспорте {#transport-spilling}

Данный тип спиллинга функционирует на уровне передачи данных между различными этапами выполнения запроса. Подсистема передачи данных автоматически буферизует и выгружает данные при переполнении буферов. Это помогает не блокировать операции, генерирующие данные, даже в ситуациях, когда принимающая сторона временно не готова принять данные.

##### Механизм функционирования

Подсистема передачи данных осуществляет постоянный мониторинг своего состояния:

1. **Буферизация**: Входящие данные накапливаются во внутренних буферах подсистемы
2. **Контроль заполнения**: Система отслеживает уровень заполнения буферов
3. **Автоматический спиллинг**: При достижении лимитов данные автоматически сериализуются и передаются в Spilling Service
4. **Продолжение функционирования**: Подсистема продолжает прием новых данных после освобождения места в памяти
5. **Восстановление**: При готовности следующего этапа данные читаются из внешнего хранилища и передаются далее

## Взаимодействие с контроллером памяти

При выполнении запросов YDB старается умещаться в заданный лимит памяти, который устанавливается [контроллером памяти](https://ydb.tech/docs/ru/reference/configuration/memory_controller_config.md). Чтобы продолжать помещаться в этот лимит даже при росте промежуточных вычислений, используется спиллинг. Подробнее см. раздел [Управление памятью](https://ydb.tech/docs/ru/reference/configuration/table_service_config.md#memory-management).

## См. также

- [Spilling Service](https://ydb.tech/docs/ru/contributor/spilling-service.md)
- [Конфигурация спиллинга](https://ydb.tech/docs/ru/reference/configuration/table_service_config.md)
- [Мониторинг YDB](https://ydb.tech/docs/ru/devops/observability/monitoring.md)
- [Диагностика производительности](https://ydb.tech/docs/ru/troubleshooting/performance/index.md)
