Puede ejecutar la instrucción INSERT para insertar nuevas filas en una tabla específica. Este tema describe cómo utilizar la instrucción INSERT en Hologres.
Sintaxis
En Hologres, puede insertar una o más filas especificadas mediante expresiones de valor, o bien cero o más filas devueltas por una consulta. La instrucción INSERT utiliza la siguiente sintaxis:
INSERT INTO <schema>.<table> [( <column> [, ...] )]
VALUES ( {<expression>} [, ...] )
[, ...] | <query>}
La siguiente tabla describe los parámetros de la sintaxis anterior.
|
Parámetro |
Descripción |
|
schema |
El nombre del esquema donde reside la tabla. |
|
table |
El nombre de la tabla en la que desea insertar datos. Si utiliza Flink para escribir datos en Hologres, puede especificar una tabla padre. Los datos se escriben automáticamente en sus tablas hijas. En Hologres V1.3 y versiones posteriores, puede ejecutar la instrucción INSERT que cumple con la sintaxis para usar un plan fijo y escribir datos directamente en la tabla padre. Para obtener más información, consulte Accelerate SQL execution with fixed plans. |
|
column |
El nombre de la columna en la que desea insertar datos. Puede calificar el nombre de la columna mediante un nombre de subcampo o un subíndice de matriz. Si inserta datos solo en algunos campos de una columna compuesta, los demás campos permanecerán como nulos. |
|
expression |
La expresión o valor que se asigna a la columna correspondiente. |
|
query |
La instrucción SELECT que proporciona las filas que se van a insertar. Para obtener más información sobre la sintaxis de la instrucción SELECT, consulte SELECT. |
La instrucción INSERT solo admite los siguientes métodos de escritura de datos:
-
INSERT INTO VALUESINSERT INTO holo2mysqltest (cate_id, cate_name) VALUES (3, 'true'), (3, 'fale'), (3, 'trxxue'), (3, 'x'), (4, 'The Dinner Game'); -
INSERT INTO SELECT:
INSERT INTO test2 SELECT * FROM test1;
Funcionamiento
Los modos de almacenamiento de las tablas de Hologres incluyen almacenamiento orientado a filas, almacenamiento orientado a columnas y almacenamiento híbrido de filas y columnas. Los tres modos de almacenamiento comparten el mismo principio de escritura.
La instrucción INSERT se ejecuta para escribir datos en registros de write-ahead logging (WAL) en modo Append Only y actualizar los datos en una tabla de memoria en tiempo real. Esto garantiza que los datos se puedan consultar inmediatamente después de su escritura. Sin embargo, las tablas de memoria tienen un tamaño fijo. Si una tabla de memoria se llena, Hologres cambia a otra tabla de memoria y activa el proceso de flush asíncrono en el backend para volcar gradualmente los datos en archivos. Estos archivos se almacenan en Apsara Distributed File System. Durante el proceso de flush, se genera una gran cantidad de archivos pequeños. Hologres fusiona y ordena estos archivos pequeños en el backend. Este proceso se denomina compactación. Para acelerar la escritura de datos, Hologres escribe los datos en el backend, y los comprime y ordena cuando se realiza la compactación asíncrona. Por lo tanto, el uso de almacenamiento aumenta significativamente durante el proceso de escritura de datos. Una vez que finalizan los procesos de escritura y compactación, el uso de almacenamiento disminuye.
Las tablas orientadas a filas, las tablas orientadas a columnas y las tablas híbridas utilizan diferentes formatos de índice para las tablas en memoria y emplean distintos procesos para volcar los datos en archivos.
Tablas orientadas a filas: Los datos se vuelcan en archivos orientados a filas con formato SST.
Tablas orientadas a columnas: Los datos se vuelcan en archivos orientados a columnas con formato ORC.
Tablas híbridas de filas y columnas: Los datos se vuelcan en archivos orientados a filas con formato SST y en archivos orientados a columnas con formato ORC. Durante el proceso de volcado, se garantiza la consistencia de los datos. Solo se devuelve un mensaje de éxito si los datos se han volcado correctamente tanto en los archivos orientados a filas como en los orientados a columnas. Si se utiliza el almacenamiento híbrido, los datos se almacenan por duplicado, lo que incrementa la sobrecarga de almacenamiento.
Límites
Si inserta datos en una tabla particionada, asegúrese de que los datos se inserten en una tabla hija y no en la tabla padre. El valor del campo de partición en los datos que se van a insertar debe coincidir con el valor del campo de partición de la tabla hija.
Puede personalizar el orden en el que se enumeran los nombres de las columnas. Si utiliza la instrucción
INSERT INTO SELECTpara insertar datos, asegúrese de que los tipos de datos de las columnas requeridas coincidan con los tipos de datos de las columnas que consulta.
Ejemplos
Hologres V2.1.17 y versiones posteriores son compatibles con Serverless Computing. Para escenarios como la importación de datos offline a gran escala, trabajos ETL grandes y consultas de alto volumen en tablas externas, puede utilizar Serverless Computing para ejecutar estas tareas. Esta función utiliza recursos serverless adicionales en lugar de los recursos de su instancia, lo que mejora la estabilidad de la instancia y reduce la probabilidad de errores de falta de memoria (OOM). No necesita reservar recursos de cómputo adicionales para su instancia y solo se le cobra por las tareas que ejecuta. Para obtener más información sobre Serverless Computing, consulte Serverless Computing. Para ver instrucciones sobre cómo utilizar Serverless Computing, consulte Use Serverless Computing.
-
Insertar datos en una tabla interna.
CREATE TABLE holotest ( a int, b bigint, c bool, e decimal(38,10), f text, g timestamp, h timestamptz, i jsonb, j int[] ); -- Optional. We recommend that you use the Serverless Computing feature to import a large amount of data offline and run extract, transform, and load (ETL) jobs. SET hg_computing_resource = 'serverless'; -- Import data. INSERT INTO holotest VALUES (1,9223372036854775807,false,123.123456789123,'john','2020-01-01 01:01:01.123456', '2004-10-19 10:23:54+08','{"a":2}',ARRAY[1, 2, 3, 4]); -- Reset the configurations. This ensures that serverless computing resources are not used for subsequent SQL statements. RESET hg_computing_resource; -
Insertar datos de la tabla a en la tabla b.
CREATE TABLE holotest2( a int, b bigint, c bool); -- Optional. We recommend that you use the Serverless Computing feature to import a large amount of data offline and run ETL jobs. SET hg_computing_resource = 'serverless'; -- Import data. INSERT INTO holotest2 (a,b,c) SELECT a,b,c FROM holotest; -- Reset the configurations. This ensures that serverless computing resources are not used for subsequent SQL statements. RESET hg_computing_resource; -
Insertar datos en una tabla particionada.
-- Create a parent table that does not have a primary key and its child tables in the public schema. BEGIN; CREATE TABLE public.hologres_parent( a text, b int, c timestamp, d text ) PARTITION BY list(a); CALL set_table_property('public.hologres_parent', 'orientation', 'column'); CREATE TABLE public.hologres_2022 partition of public.hologres_parent for values in('2022'); CREATE TABLE public.hologres_2021 partition of public.hologres_parent for values in('2021'); CREATE TABLE public.hologres_2020 partition of public.hologres_parent for values in('2020'); COMMIT; -- Optional. We recommend that you use the Serverless Computing feature to import a large amount of data offline and run ETL jobs. SET hg_computing_resource = 'serverless'; -- Insert data into a child table. INSERT INTO public.hologres_2022 values('2022',1,now(),'a') -- Reset the configurations. This ensures that serverless computing resources are not used for subsequent SQL statements. RESET hg_computing_resource;
Preguntas frecuentes
-
Pregunta 1: Al escribir una gran cantidad de datos, el uso de CPU y memoria de la instancia alcanza el 100%. Esto afecta negativamente la escritura de datos y las consultas en la instancia. ¿Qué debo hacer?
Se recomienda utilizar la función Serverless Computing cuando necesite escribir una gran cantidad de datos.
NotaHologres V2.1.17 y versiones posteriores son compatibles con la función Serverless Computing. Esta función es adecuada para escenarios en los que se requiere importar una gran cantidad de datos offline, ejecutar trabajos ETL a gran escala o consultar grandes volúmenes de datos mediante tablas externas. Puede utilizar recursos de cómputo serverless en lugar de los recursos reservados de las instancias para realizar estas operaciones. No se requieren recursos de cómputo reservados. Esto mejora la estabilidad de la instancia y reduce la aparición de errores de falta de memoria (OOM). Solo se le cobra por los recursos de cómputo serverless que utilicen las tareas. Para obtener más información sobre la función Serverless Computing, consulte Serverless computing. Para obtener más información sobre cómo utilizar la función Serverless Computing, consulte Work with serverless computing.
-
Pregunta 2: La métrica que indica el uso de almacenamiento aumenta significativamente cuando escribo datos, pero disminuye después de que se completa la escritura. ¿Por qué sucede esto?
Según el principio de escritura de datos, para acelerar este proceso, Hologres escribe los datos en el backend y los comprime y ordena cuando se realiza la compactación asíncrona. Por lo tanto, el uso de almacenamiento aumenta significativamente durante el proceso de escritura de datos. Una vez que finalizan los procesos de escritura y compactación, el uso de almacenamiento disminuye.
-
Pregunta 3: ¿Por qué aumenta la latencia si se ejecutan varias instrucciones
INSERTen paralelo sobre la misma tabla?Si se ejecuta la instrucción
INSERTen una tabla sin utilizar un plan fijo, la tabla se bloquea. La ejecución paralela de instruccionesINSERTincrementa el tiempo de espera del bloqueo, lo que resulta en un aumento de la latencia. -
Pregunta 4: ¿Por qué se devuelve el mensaje de error
ERROR: no partition of relation "<table_name>" found for rowal escribir datos en una tabla padre?Descripción del problema: Se reporta el mensaje de error
ERROR: no partition of relation "<table_name>" found for row.Causa: No existe ninguna tabla hija.
-
Solución: Antes de escribir datos, cree una tabla hija ejecutando la siguiente instrucción:
CREATE TABLE <child_table_name> partition of <parent_table_name> for values in (<value>);
-
Pregunta 5: ¿Por qué se devuelve el mensaje de error
Currently inserting into parent table is not supportedal importar datos?Descripción del problema: Se reporta el mensaje de error
Currently inserting into parent table is not supportedal importar datos.Causa: La tabla en la que intenta insertar datos es una tabla padre. Hologres no permite escribir datos directamente en una tabla padre.
Solución: Cree una tabla hija y escriba los datos en dicha tabla hija.