Al usar el motor de tabla Memory en ClickHouse Cloud, los datos no se replican en todos los nodos (por diseño). Para garantizar que todas las consultas se enruten al mismo nodo y que el motor de tabla Memory funcione como se espera, puede hacer una de las siguientes cosas:
- Ejecutar todas las operaciones en la misma sesión
- Usar un cliente que utilice TCP o la interfaz nativa (lo que habilita la compatibilidad con conexiones persistentes), como clickhouse-client
El motor Memory almacena los datos en RAM, sin comprimir. Los datos se almacenan exactamente en la misma forma en que se reciben al leerlos. En otras palabras, leer de esta tabla no tiene coste.
El acceso concurrente a los datos está sincronizado. Los bloqueos son breves: las operaciones de lectura y escritura no se bloquean entre sí.
No se admiten índices. La lectura se paraleliza.
La productividad máxima (más de 10 GB/s) se alcanza en consultas simples, porque no hay lectura desde el disco, ni descompresión, ni deserialización de datos. (Cabe señalar que, en muchos casos, la productividad del motor MergeTree es casi igual de alta).
Al reiniciar el servidor, los datos desaparecen de la tabla y esta queda vacía.
Normalmente, no se justifica el uso de este motor de tabla. Sin embargo, puede utilizarse para pruebas y para tareas en las que se requiere la máxima velocidad con un número relativamente pequeño de filas (hasta aproximadamente 100.000.000).
El motor Memory es utilizado por el sistema para tablas temporales con datos externos de consulta (consulte la sección “Datos externos para procesar una consulta”), y para implementar GLOBAL IN (consulte la sección “Operadores IN”).
Se pueden especificar límites superior e inferior para limitar el tamaño de la tabla del motor Memory, lo que le permite actuar de forma efectiva como un búfer circular (consulte Parámetros del motor).
min_bytes_to_keep — Cantidad mínima de bytes que se deben conservar cuando la tabla en memoria tiene un límite de tamaño.
- Valor predeterminado:
0
- Requiere
max_bytes_to_keep
max_bytes_to_keep — Cantidad máxima de bytes que se deben conservar en la tabla en memoria, donde las filas más antiguas se eliminan en cada inserción (es decir, como un búfer circular). La cantidad máxima de bytes puede superar el límite indicado si el lote más antiguo de filas que debe eliminarse queda por debajo del límite de min_bytes_to_keep al añadir un bloque grande.
min_rows_to_keep — Cantidad mínima de filas que se deben conservar cuando la tabla en memoria tiene un límite de tamaño.
- Valor predeterminado:
0
- Requiere
max_rows_to_keep
max_rows_to_keep — Cantidad máxima de filas que se deben conservar en la tabla en memoria, donde las filas más antiguas se eliminan en cada inserción (es decir, como un búfer circular). La cantidad máxima de filas puede superar el límite indicado si el lote más antiguo de filas que debe eliminarse queda por debajo del límite de min_rows_to_keep al añadir un bloque grande.
compress - Si los datos en memoria deben comprimirse.
- Valor predeterminado:
false
Inicializar la configuración
CREATE TABLE memory (i UInt32) ENGINE = Memory SETTINGS min_rows_to_keep = 100, max_rows_to_keep = 1000;
Modificar la configuración
ALTER TABLE memory MODIFY SETTING min_rows_to_keep = 100, max_rows_to_keep = 1000;
Nota: Los parámetros de límite para bytes y rows pueden establecerse al mismo tiempo; sin embargo, se aplicarán los límites inferiores de max y min.
CREATE TABLE memory (i UInt32) ENGINE = Memory SETTINGS min_bytes_to_keep = 4096, max_bytes_to_keep = 16384;
/* 1. probando que el bloque más antiguo no se elimina debido al umbral mínimo - 3000 filas */
INSERT INTO memory SELECT * FROM numbers(0, 1600); -- 8'192 bytes
/* 2. añadiendo bloque que no se elimina */
INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 1'024 bytes
/* 3. probando que el bloque más antiguo se elimina - 9216 bytes - 1100 */
INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 8'192 bytes
/* 4. comprobando que un bloque muy grande sobrescribe todo */
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 │
└─────────────┴────────────┘
además, para las filas:
CREATE TABLE memory (i UInt32) ENGINE = Memory SETTINGS min_rows_to_keep = 4000, max_rows_to_keep = 10000;
/* 1. probando que el bloque más antiguo no se elimina debido al umbral mínimo - 3000 filas */
INSERT INTO memory SELECT * FROM numbers(0, 1600); -- 1'600 filas
/* 2. añadiendo bloque que no se elimina */
INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 100 filas
/* 3. probando que el bloque más antiguo se elimina - 9216 bytes - 1100 */
INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 1'000 filas
/* 4. comprobando que un bloque muy grande sobrescribe todo */
INSERT INTO memory SELECT * FROM numbers(9000, 10000); -- 10'000 filas
SELECT total_bytes, total_rows FROM system.tables WHERE name = 'memory' AND database = currentDatabase();
┌─total_bytes─┬─total_rows─┐
│ 65536 │ 10000 │
└─────────────┴────────────┘
Última modificación el 10 de junio de 2026