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).
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
- Valor predeterminado:
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 demin_bytes_to_keepal añadir un bloque grande.- Valor predeterminado:
0
- Valor predeterminado:
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
- Valor predeterminado:
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 demin_rows_to_keepal añadir un bloque grande.- Valor predeterminado:
0
- Valor predeterminado:
compress- Si los datos en memoria deben comprimirse.- Valor predeterminado:
false
- Valor predeterminado:
Uso
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.
Ejemplos
CREATE TABLE memory (i UInt32) ENGINE = Memory SETTINGS min_bytes_to_keep = 4096, max_bytes_to_keep = 16384;
/* 1. testing oldest block doesn't get deleted due to min-threshold - 3000 rows */
INSERT INTO memory SELECT * FROM numbers(0, 1600); -- 8'192 bytes
/* 2. adding block that doesn't get deleted */
INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 1'024 bytes
/* 3. testing oldest block gets deleted - 9216 bytes - 1100 */
INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 8'192 bytes
/* 4. checking a very large block overrides all */
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. testing oldest block doesn't get deleted due to min-threshold - 3000 rows */
INSERT INTO memory SELECT * FROM numbers(0, 1600); -- 1'600 rows
/* 2. adding block that doesn't get deleted */
INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 100 rows
/* 3. testing oldest block gets deleted - 9216 bytes - 1100 */
INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 1'000 rows
/* 4. checking a very large block overrides all */
INSERT INTO memory SELECT * FROM numbers(9000, 10000); -- 10'000 rows
SELECT total_bytes, total_rows FROM system.tables WHERE name = 'memory' AND database = currentDatabase();┌─total_bytes─┬─total_rows─┐
│ 65536 │ 10000 │
└─────────────┴────────────┘