Перейти к основному содержанию
При использовании движка таблицы Memory в ClickHouse Cloud данные не реплицируются между всеми узлами (это сделано намеренно). Чтобы гарантировать, что все запросы направляются на один и тот же узел и что движок таблицы Memory работает ожидаемым образом, можно сделать одно из следующего:
  • Выполнять все операции в рамках одного сеанса
  • Использовать клиент, работающий через TCP или нативный интерфейс (что обеспечивает поддержку sticky connections), например clickhouse-client
Движок Memory хранит данные в оперативной памяти в несжатом виде. Данные хранятся ровно в том виде, в котором они были получены при чтении. Иными словами, чтение из этой таблицы практически ничего не стоит. Одновременный доступ к данным синхронизируется. Блокировки короткие: операции чтения и записи не блокируют друг друга. Индексы не поддерживаются. Чтение распараллеливается. Максимальная производительность (более 10 ГБ/с) достигается на простых запросах, поскольку не требуется чтение с диска, распаковка или десериализация данных. (Следует отметить, что во многих случаях производительность движка MergeTree почти такая же высокая.) При перезапуске сервера данные из таблицы исчезают, и таблица становится пустой. Обычно использование этого движка таблицы не оправдано. Однако его можно использовать для тестов и задач, где требуется максимальная скорость при сравнительно небольшом количестве строк (примерно до 100 000 000). Движок Memory используется системой для временных таблиц с внешними данными запроса (см. раздел «Внешние данные для обработки запроса»), а также для реализации GLOBAL IN (см. раздел «Операторы IN»). Чтобы ограничить размер таблицы с движком Memory, можно задать верхнюю и нижнюю границы, что фактически позволяет использовать её как кольцевой буфер (см. параметр движка).

Параметры движка

  • min_bytes_to_keep — Минимальное количество байтов, сохраняемых при ограничении размера таблицы Memory.
    • Значение по умолчанию: 0
    • Требует max_bytes_to_keep
  • max_bytes_to_keep — Максимальное количество байтов, сохраняемых в таблице Memory, в которой при каждой вставке удаляются самые старые строки (то есть используется кольцевой буфер). Это значение может превышать указанный предел, если при добавлении большого блока самый старый батч строк, подлежащий удалению, попадает под ограничение min_bytes_to_keep.
    • Значение по умолчанию: 0
  • min_rows_to_keep — Минимальное количество строк, сохраняемых при ограничении размера таблицы Memory.
    • Значение по умолчанию: 0
    • Требует max_rows_to_keep
  • max_rows_to_keep — Максимальное количество строк, сохраняемых в таблице Memory, в которой при каждой вставке удаляются самые старые строки (то есть используется кольцевой буфер). Это значение может превышать указанный предел, если при добавлении большого блока самый старый батч строк, подлежащий удалению, попадает под ограничение min_rows_to_keep.
    • Значение по умолчанию: 0
  • compress - Следует ли сжимать данные в памяти.
    • Значение по умолчанию: false

Использование

Инициализация настроек
CREATE TABLE memory (i UInt32) ENGINE = Memory SETTINGS min_rows_to_keep = 100, max_rows_to_keep = 1000;
Изменение настроек
ALTER TABLE memory MODIFY SETTING min_rows_to_keep = 100, max_rows_to_keep = 1000;
Примечание: Оба параметра ограничения bytes и rows можно задать одновременно, однако при этом будут использоваться меньшие значения max и min.

Примеры

CREATE TABLE memory (i UInt32) ENGINE = Memory SETTINGS min_bytes_to_keep = 4096, max_bytes_to_keep = 16384;

/* 1. проверка: старейший блок не удаляется из-за минимального порога - 3000 строк */
INSERT INTO memory SELECT * FROM numbers(0, 1600); -- 8'192 bytes

/* 2. добавление блока, который не удаляется */
INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 1'024 bytes

/* 3. проверка: старейший блок удаляется - 9216 байт - 1100 */
INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 8'192 bytes

/* 4. проверка: очень большой блок вытесняет все остальные */
INSERT INTO memory SELECT * FROM numbers(9000, 10000); -- 65'536 bytes

SELECT total_bytes, total_rows FROM system.tables WHERE name = 'memory' AND database = currentDatabase();
┌─total_bytes─┬─total_rows─┐
│       65536 │      10000 │
└─────────────┴────────────┘
также для строк:
CREATE TABLE memory (i UInt32) ENGINE = Memory SETTINGS min_rows_to_keep = 4000, max_rows_to_keep = 10000;

/* 1. проверка: старейший блок не удаляется из-за минимального порога - 3000 строк */
INSERT INTO memory SELECT * FROM numbers(0, 1600); -- 1'600 строк

/* 2. добавление блока, который не удаляется */
INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 100 строк

/* 3. проверка: старейший блок удаляется - 9216 байт - 1100 */
INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 1'000 строк

/* 4. проверка: очень большой блок вытесняет все остальные */
INSERT INTO memory SELECT * FROM numbers(9000, 10000); -- 10'000 строк

SELECT total_bytes, total_rows FROM system.tables WHERE name = 'memory' AND database = currentDatabase();
┌─total_bytes─┬─total_rows─┐
│       65536 │      10000 │
└─────────────┴────────────┘
Последнее изменение 10 июня 2026 г.