Execute a instrução INSERT para adicionar novas linhas a uma tabela específica. Este tópico descreve como utilizar a instrução INSERT no Hologres.
Sintaxe
É possível inserir em uma tabela do Hologres uma ou mais linhas definidas por expressões de valor, ou zero ou mais linhas retornadas por uma consulta. A instrução INSERT utiliza a seguinte sintaxe:
INSERT INTO <schema>.<table> [( <column> [, ...] )]
VALUES ( {<expression>} [, ...] )
[, ...] | <query>}
A tabela a seguir descreve os parâmetros da sintaxe apresentada anteriormente.
|
Parâmetro |
Descrição |
|
schema |
Nome do schema onde a tabela está localizada. |
|
table |
Nome da tabela de destino para a inserção de dados. Caso utilize o Flink para gravar dados no Hologres, especifique uma tabela pai. Os dados serão gravados automaticamente nas tabelas filhas correspondentes. A partir do Hologres V1.3, é possível executar a instrução INSERT com a sintaxe de fixed plan para gravar dados diretamente na tabela pai. Para mais informações, consulte Accelerate SQL execution with fixed plans. |
|
column |
Nome da coluna de destino para a inserção de dados. Qualifique o nome da coluna utilizando um nome de subcampo ou um subscrito de array. Ao inserir dados apenas em alguns campos de uma coluna composta, os demais campos permanecerão nulos. |
|
expression |
Expressão ou valor atribuído à coluna correspondente. |
|
query |
Instrução SELECT que fornece as linhas a serem inseridas. Para mais detalhes sobre a sintaxe da instrução SELECT, consulte SELECT. |
A instrução INSERT suporta apenas os seguintes métodos de gravação de dados:
-
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;
Funcionamento
Os modos de armazenamento das tabelas do Hologres incluem armazenamento orientado a linhas, orientado a colunas e híbrido (linha-coluna). Esses três modos compartilham o mesmo princípio de gravação.
A instrução INSERT grava dados nos logs de write-ahead logging (WAL) no modo Append Only e atualiza os dados em uma tabela de memória em tempo real. Isso garante que os dados estejam disponíveis para consulta imediatamente após a gravação. No entanto, como as tabelas de memória possuem tamanho fixo, ao atingir a capacidade máxima, o Hologres alterna para outra tabela de memória e aciona um processo assíncrono de flush em segundo plano para persistir gradualmente os dados em arquivos. Esses arquivos são armazenados no Apsara Distributed File System. Durante o flush, diversos arquivos pequenos são gerados. O Hologres mescla e ordena esses arquivos em segundo plano em um processo denominado compactação. Para acelerar a gravação, o sistema realiza a escrita em segundo plano e aplica compressão e ordenação durante a compactação assíncrona. Consequentemente, o uso de armazenamento aumenta significativamente durante a gravação dos dados. Após a conclusão da gravação e da compactação, o uso de armazenamento diminui.
Tabelas orientadas a linhas, orientadas a colunas e híbridas utilizam formatos de índice distintos para as tabelas em memória e seguem processos diferentes para realizar o flush dos dados para arquivos.
Tabelas orientadas a linhas: O flush dos dados ocorre para arquivos orientados a linhas no formato SST.
Tabelas orientadas a colunas: Os dados são persistidos em arquivos orientados a colunas no formato ORC.
Tabelas híbridas (linha-coluna): O sistema realiza o flush simultaneamente para arquivos orientados a linhas (formato SST) e orientados a colunas (formato ORC), garantindo a consistência dos dados durante o processo. Uma mensagem de sucesso é retornada somente se a gravação for concluída em ambos os tipos de arquivo. O armazenamento híbrido duplica os dados, o que aumenta a sobrecarga de armazenamento.
Limites
Ao inserir dados em uma tabela particionada, certifique-se de que a inserção seja feita na tabela filha, e não na tabela pai. O valor do campo de particionamento nos dados a serem inseridos deve corresponder exatamente ao valor do campo de particionamento da tabela filha.
A ordem de listagem dos nomes das colunas pode ser personalizada. Caso utilize a instrução
INSERT INTO SELECTpara inserir dados, verifique se os tipos de dados das colunas de destino são compatíveis com os tipos de dados das colunas consultadas.
Exemplos
O Hologres V2.1.17 e versões posteriores suportam Serverless Computing. Para cenários como importação de grandes volumes de dados offline, jobs ETL complexos e consultas massivas em tabelas externas, utilize o Serverless Computing para executar essas tarefas. Esse recurso consome recursos serverless adicionais em vez dos recursos da sua instância, melhorando a estabilidade e reduzindo a probabilidade de erros de falta de memória (OOM). Não é necessário reservar recursos computacionais extras para a instância, e o faturamento ocorre apenas com base nas tarefas executadas. Para mais informações sobre o Serverless Computing, consulte Serverless Computing. Para instruções sobre como utilizar o Serverless Computing, consulte Use Serverless Computing.
-
Insira dados em uma tabela 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; -
Insira dados da tabela a na tabela 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; -
Insira dados em uma tabela 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;
Perguntas frequentes
-
Pergunta 1: Ao gravar um grande volume de dados, a utilização da CPU e o uso de memória da instância atingem 100%, afetando negativamente as gravações e consultas. Como proceder?
Recomendamos a utilização do recurso Serverless Computing para gravações de grandes volumes de dados.
NotaO Hologres V2.1.17 e versões posteriores suportam o recurso Serverless Computing. Esse recurso é ideal para cenários de importação massiva de dados offline, execução de jobs ETL em larga escala ou consultas extensas via tabelas externas. Utilize recursos de computação serverless em vez dos recursos reservados da instância para realizar essas operações. Isso elimina a necessidade de reservar recursos computacionais, melhora a estabilidade da instância e reduz a ocorrência de erros de falta de memória (OOM). O faturamento é aplicado apenas aos recursos serverless consumidos pelas tarefas. Para mais informações sobre o recurso Serverless Computing, consulte Serverless computing. Para saber como utilizar o Serverless Computing, consulte Work with serverless computing.
-
Pergunta 2: Por que a métrica de uso de armazenamento aumenta significativamente durante a gravação de dados e diminui após a conclusão?
De acordo com o princípio de gravação, para acelerar o processo, o Hologres escreve os dados em segundo plano e aplica compressão e ordenação durante a compactação assíncrona. Por esse motivo, o uso de armazenamento aumenta consideravelmente durante a gravação. Após a finalização da gravação e da compactação, o uso de armazenamento retorna aos níveis normais.
-
Pergunta 3: Por que a latência aumenta quando múltiplas instruções
INSERTsão executadas em paralelo na mesma tabela?Quando a instrução
INSERTé executada em uma tabela sem o uso de fixed plan, a tabela é bloqueada. A execução paralela de instruçõesINSERTaumenta o tempo de espera pelo bloqueio, resultando em maior latência. -
Pergunta 4: Por que a mensagem de erro
ERROR: no partition of relation "<table_name>" found for rowé retornada ao gravar dados em uma tabela pai?Descrição do problema: O sistema reporta o erro
ERROR: no partition of relation "<table_name>" found for row.Causa: Nenhuma tabela filha existe.
-
Solução: Antes de gravar dados, crie uma tabela filha executando a seguinte instrução:
CREATE TABLE <child_table_name> partition of <parent_table_name> for values in (<value>);
-
Pergunta 5: Por que a mensagem de erro
Currently inserting into parent table is not supportedaparece durante a importação de dados?Descrição do problema: O erro
Currently inserting into parent table is not supportedé reportado durante a importação de dados.Causa: A tabela de destino da inserção é uma tabela pai. O Hologres não permite a gravação direta de dados em tabelas pai.
Solução: Crie uma tabela filha e realize a gravação dos dados nessa tabela filha.