Transforme dados com a linguagem de manipulação de dados (DML)
A linguagem de manipulação de dados (DML) do BigQuery permite-lhe atualizar, inserir e eliminar dados das suas tabelas do BigQuery.
Pode executar declarações DML tal como faria com uma declaração SELECT, com as seguintes condições:
- Tem de usar o GoogleSQL. Para ativar o GoogleSQL, consulte o artigo Mudar de dialeto de SQL.
- Não pode especificar uma tabela de destino para a consulta.
Para mais informações sobre como calcular o número de bytes processados por uma declaração DML, consulte o artigo Cálculo do tamanho da consulta a pedido.
Limitações
Cada declaração DML inicia uma transação implícita, o que significa que as alterações feitas pela declaração são automaticamente confirmadas no final de cada declaração DML bem-sucedida.
Não é possível modificar as linhas escritas recentemente através do método de streaming
tabledata.insertallcom a linguagem de manipulação de dados (DML), como as declaraçõesUPDATE,DELETE,MERGEouTRUNCATE. As gravações recentes são as que ocorreram nos últimos 30 minutos. Todas as outras linhas na tabela permanecem modificáveis através de declaraçõesUPDATE,DELETE,MERGEouTRUNCATE. Os dados transmitidos podem demorar até 90 minutos a ficar disponíveis para operações de cópia.Em alternativa, as linhas escritas recentemente através da API Storage Write podem ser modificadas através das declarações
UPDATE,DELETEouMERGE. Para mais informações, consulte o artigo Use a linguagem de manipulação de dados (DML) com dados transmitidos recentemente.As subconsultas correlacionadas numa cláusula
when_clause,search_condition,merge_update_clauseoumerge_insert_clausenão são suportadas para declaraçõesMERGE.As consultas que contêm declarações DML não podem usar uma tabela com carateres universais como destino da consulta. Por exemplo, pode usar uma tabela com carateres universais na cláusula
FROMde uma consultaUPDATE, mas não pode usar uma tabela com carateres universais como destino da operaçãoUPDATE.
Instruções DML
As secções seguintes descrevem os diferentes tipos de declarações DML e como as pode usar.
INSERT declaração
Use a declaração INSERT para adicionar novas linhas a uma tabela existente. O exemplo
seguinte insere novas linhas na tabela dataset.Inventory com valores especificados
explicitamente.
INSERT dataset.Inventory (product, quantity)
VALUES('whole milk', 10),
('almond milk', 20),
('coffee beans', 30),
('sugar', 0),
('matcha', 20),
('oat milk', 30),
('chai', 5)
/+-------------------+----------+
| product | quantity |
+-------------------+----------+
| almond milk | 20 |
| chai | 5 |
| coffee beans | 30 |
| matcha | 20 |
| oat milk | 30 |
| sugar | 0 |
| whole milk | 10 |
+-------------------+----------+/
Para mais informações sobre as declarações INSERT, consulte a declaração INSERT.
DELETE declaração
Use a declaração DELETE para eliminar linhas numa tabela. O exemplo seguinte
elimina todas as linhas na tabela dataset.Inventory que têm o valor quantity
0.
DELETE dataset.Inventory
WHERE quantity = 0
/+-------------------+----------+
| product | quantity |
+-------------------+----------+
| almond milk | 20 |
| chai | 5 |
| coffee beans | 30 |
| matcha | 20 |
| oat milk | 30 |
| whole milk | 10 |
+-------------------+----------+/
Para eliminar todas as linhas de uma tabela, use a declaração TRUNCATE TABLE. Para mais informações sobre os extratos DELETE, consulte o artigo Extrato DELETE.
TRUNCATE declaração
Use a declaração TRUNCATE para remover todas as linhas de uma tabela, mas deixando os metadados da tabela intactos, incluindo o esquema, a descrição e as etiquetas da tabela. O exemplo seguinte remove todas as linhas da tabela dataset.Inventory.
TRUNCATE dataset.Inventory
Para eliminar linhas específicas numa tabela. Em alternativa, use a declaração DELETE. Para mais informações sobre a declaração TRUNCATE, consulte a declaração TRUNCATE.
UPDATE declaração
Use a declaração UPDATE para atualizar as linhas existentes numa tabela. A declaração UPDATE
também tem de incluir a palavra-chave WHERE para especificar uma condição. O exemplo seguinte reduz o valor de quantity das linhas em 10 para produtos que contêm a string milk.
UPDATE dataset.Inventory
SET quantity = quantity - 10,
WHERE product LIKE '%milk%'
/+-------------------+----------+
| product | quantity |
+-------------------+----------+
| almond milk | 10 |
| chai | 5 |
| coffee beans | 30 |
| matcha | 20 |
| oat milk | 20 |
| whole milk | 0 |
+-------------------+----------+/
As declarações UPDATE também podem incluir cláusulas FROM para incluir tabelas unidas.
Para mais informações sobre os extratos UPDATE, consulte o extrato UPDATE.
MERGE declaração
A declaração MERGE combina as operações INSERT, UPDATE e DELETE numa única declaração e executa as operações de forma atómica para unir dados de uma tabela a outra. Para mais informações e exemplos acerca da declaração MERGE, consulte a declaração MERGE.
Tarefas simultâneas
O BigQuery gere a simultaneidade das declarações DML que adicionam, modificam ou eliminam linhas numa tabela.
Concorrência de DML de INSERÇÃO
Durante qualquer período de 24 horas, as primeiras 1500 declarações INSERT são executadas imediatamente após o envio. Depois de atingir este limite, a concorrência de declarações INSERT que escrevem numa tabela está limitada a 10. As declarações INSERT adicionais são adicionadas a uma fila PENDING. É possível colocar até 100 declarações INSERT
em fila contra uma tabela em qualquer altura. Quando uma declaração INSERT
é concluída, a declaração INSERT seguinte é removida da fila e executada.
Se tiver de executar declarações de DML INSERT com mais frequência,
considere fazer stream de dados para a sua tabela através da
API Storage Write.
Concorrência de DML UPDATE, DELETE e MERGE
As instruções DML UPDATE, DELETE e MERGE são denominadas instruções DML de mutação. Se enviar uma ou mais declarações DML de mutação numa tabela enquanto outras tarefas DML de mutação na mesma ainda estão em execução (ou pendentes), o BigQuery executa até 2 delas em simultâneo. Depois disso, até 20 são colocadas em fila como PENDING. Quando uma tarefa em execução anterior termina, a próxima tarefa pendente é removida da fila e executada. As declarações DML de mutação em fila partilham uma fila por tabela com um comprimento máximo de 20. As declarações adicionais que excedam o comprimento máximo da fila para cada tabela falham com a mensagem de erro: Resources
exceeded during query execution: Too many DML statements outstanding against
table PROJECT_ID:DATASET.TABLE, limit is 20.
As tarefas de DML de prioridade interativa que estão em fila durante mais de 7 horas falham com a seguinte mensagem de erro:
DML statement has been queued for too long
Conflitos de instruções DML
A alteração de instruções DML executadas em simultâneo numa tabela provoca conflitos de instruções DML quando as instruções tentam alterar a mesma partição. As declarações são bem-sucedidas desde que não modifiquem a mesma partição. O BigQuery tenta executar novamente as declarações com falhas até três vezes.
Uma
INSERTinstrução DML que insere linhas numa tabela não entra em conflito com nenhuma outra instrução DML em execução em simultâneo.Uma instrução DML
MERGEnão entra em conflito com outras instruções DML em execução em simultâneo, desde que a instrução apenas insira linhas e não elimine nem atualize linhas existentes. Isto pode incluir declaraçõesMERGEcom cláusulasUPDATEouDELETE, desde que essas cláusulas não sejam invocadas quando a consulta é executada.
DML detalhado
O DML detalhado é um melhoramento do desempenho concebido para otimizar a execução das instruções UPDATE, DELETE e MERGE (também conhecidas como instruções DML de alteração).
Considerações sobre o desempenho
Sem o DML detalhado ativado, as mutações DML são realizadas ao nível do grupo de ficheiros, o que pode levar a reescritas de dados ineficientes, especialmente para mutações esparsas. Isto pode levar a um consumo adicional de espaços e a tempos de execução mais longos.
O DML detalhado é um melhoramento do desempenho concebido para otimizar estas declarações de DML de mutação através da introdução de uma abordagem mais detalhada que visa reduzir a quantidade de dados que precisam de ser reescritos ao nível do grupo de ficheiros. Esta abordagem pode reduzir significativamente o tempo de processamento, E/S e intervalo consumido para alterar tarefas DML.
Existem algumas considerações de desempenho a ter em atenção quando usa DML detalhado:
- As operações DML detalhadas processam dados eliminados numa abordagem híbrida que distribui os custos de reescrita por várias mutações de tabelas. Cada operação DML pode processar uma parte dos dados eliminados e, em seguida, transferir o processamento dos dados eliminados restantes para um processo de recolha de lixo em segundo plano. Para mais informações, consulte as considerações sobre os dados eliminados.
- As tabelas com operações DML de mutação frequentes podem sofrer um aumento da latência para consultas
SELECTe tarefas DML subsequentes. Para avaliar o impacto da ativação desta funcionalidade, compare o desempenho de uma sequência realista de operações DML e leituras subsequentes. - Para tabelas grandes com partições alteradas frequentemente que excedam 2 TB, não se recomenda o DML detalhado. Estas tabelas podem sofrer uma pressão de memória adicional para consultas subsequentes, o que pode levar a uma latência de leitura adicional ou a erros de consulta.
- A ativação da DML detalhada não reduz a quantidade de bytes analisados da própria declaração de DML de mutação.
Ative o DML detalhado
Para ativar o DML detalhado, defina a opção de tabela enable_fine_grained_mutations como TRUE quando executar uma declaração DDL CREATE TABLE ou ALTER TABLE.
Para criar uma nova tabela com DML detalhado, use a declaração CREATE TABLE:
CREATE TABLE mydataset.mytable ( product STRING, inventory INT64) OPTIONS(enable_fine_grained_mutations = TRUE);
Para alterar uma tabela existente com DML detalhado, use a declaração ALTER TABLE:
ALTER TABLE mydataset.mytable SET OPTIONS(enable_fine_grained_mutations = TRUE);
Para alterar todas as tabelas existentes num conjunto de dados com DML detalhado, use a declaração ALTER TABLE:
FOR record IN
(SELECT CONCAT(table_schema, '.', table_name) AS table_path
FROM mydataset.INFORMATION_SCHEMA.TABLES)
DO
EXECUTE IMMEDIATE
"ALTER TABLE " || record.table_path || " SET OPTIONS(enable_fine_grained_mutations = TRUE)";
END FOR;Depois de a opção enable_fine_grained_mutations ser definida como TRUE, as instruções DML de mutação são executadas com capacidades DML detalhadas ativadas e usam a sintaxe de instruções DML existente.
Para determinar se uma tabela foi ativada com DML detalhado, consulte a vista INFORMATION_SCHEMA.TABLES.
O exemplo seguinte verifica que tabelas num conjunto de dados foram ativadas com esta funcionalidade:
SELECT table_schema AS datasetId, table_name AS tableId, is_fine_grained_mutations_enabled FROM DATASET_NAME.INFORMATION_SCHEMA.TABLES;
Substitua DATASET_NAME pelo nome do conjunto de dados no qual quer verificar se alguma tabela tem o DML detalhado ativado.
Desative o DML detalhado
Para desativar o DML detalhado numa tabela existente, use a declaração ALTER TABLE.
ALTER TABLE mydataset.mytable SET OPTIONS(enable_fine_grained_mutations = FALSE);
Quando desativa a DML detalhada, pode demorar algum tempo até que todos os dados eliminados sejam totalmente processados. Consulte as considerações sobre os dados eliminados. Como resultado, as limitações de DML detalhadas podem persistir até que isto ocorra.
Preços
A ativação da DML detalhada para uma tabela pode incorrer em custos adicionais. Estes custos incluem o seguinte:
- Custos de armazenamento do BigQuery para armazenar os metadados de mutação adicionais associados a operações de DML detalhadas. O custo de armazenamento real depende da quantidade de dados que é modificada, mas, na maioria das situações, espera-se que seja insignificante em comparação com o tamanho da própria tabela.
- Custos de computação do BigQuery
para processar dados eliminados através de tarefas de recolha de lixo descarregadas e consultas
SELECTsubsequentes que processam metadados de eliminação adicionais que ainda não foram recolhidos.
Pode usar reservas do BigQuery para atribuir recursos de computação do BigQuery dedicados para processar tarefas de dados eliminados transferidos. As reservas permitem-lhe definir um limite para o custo de realização destas operações. Esta abordagem é particularmente útil e, muitas vezes, recomendada para tabelas muito grandes com operações de DML de mutação detalhadas frequentes, que, de outra forma, teriam custos a pedido elevados devido ao grande número de bytes processados quando se executa cada tarefa de processamento de dados eliminados carregados.
As tarefas de tratamento de dados eliminados transferidas de DML detalhados são consideradas tarefas em segundo plano e requerem a utilização do tipo de atribuição de reserva BACKGROUND, em vez do tipo de atribuição de reserva QUERY.
Os projetos que executam operações DML detalhadas sem uma atribuição de BACKGROUND usam ospreços a pedidopara processar as tarefas de dados eliminados carregados.
| Operação | Preços a pedido | Preços baseados na capacidade |
|---|---|---|
| Alterar instruções DML | Use a
dimensionamento de DML
para determinar os cálculos de bytes analisados a pedido.
A ativação da DML detalhada não reduz a quantidade de bytes analisados da própria declaração DML. |
Consumir espaços atribuídos com um tipo QUERY no momento da execução do extrato. |
| Tarefas de processamento de dados eliminados transferidas | Use a dimensionamento de DML padrão para determinar os cálculos de bytes analisados a pedido quando são executados trabalhos de processamento de dados eliminados. | Consumir as posições atribuídas com um tipo BACKGROUND quando os trabalhos de tratamento de dados são executados. |
Considerações sobre os dados eliminados
Projetos que executam operações DML detalhadas com uma atribuição BACKGROUND
processam dados eliminados através de slots e estão sujeitos à disponibilidade de recursos da reserva configurada. Se não existirem recursos suficientes disponíveis na reserva configurada, o tratamento dos dados eliminados pode demorar mais tempo do que o previsto.
Os projetos que realizam operações DML detalhadas através da
determinação de preços a pedido ou sem uma atribuição
BACKGROUND, processam dados eliminados através da determinação de preços a pedido e têm regularmente dados eliminados processados através de recursos internos do BigQuery.
Para identificar tarefas de processamento de dados eliminados de DML detalhados transferidos, consulte a vista INFORMATION_SCHEMA.JOBS:
SELECT * FROM region-us.INFORMATION_SCHEMA.JOBS WHERE job_id LIKE "%fine_grained_mutation_garbage_collection%"
Limitações
As tabelas ativadas com DML detalhado estão sujeitas às seguintes limitações:
- Não pode usar o método
tabledata.listpara ler conteúdo de uma tabela com o DML detalhado ativado. Em alternativa, consulte a tabela com uma declaraçãoSELECTpara ler os registos da tabela. - Não é possível pré-visualizar uma tabela ativada com DML detalhado através da consola do BigQuery.
- Não pode copiar uma tabela com a DML detalhada ativada após a execução de uma declaração
UPDATE,DELETEouMERGE. - Não pode criar uma imagem instantânea da tabela
nem um clone da tabela de uma tabela com
DML detalhado ativado após a execução de uma declaração
UPDATE,DELETEouMERGE. - Não pode ativar o DML detalhado numa tabela num conjunto de dados replicado e não pode replicar um conjunto de dados que contenha uma tabela com o DML detalhado ativado.
- As instruções DML executadas numa transação de várias instruções não são otimizadas com DML detalhado.
- Não é possível ativar o DML detalhado em tabelas temporárias criadas com a declaração
CREATE TEMP TABLE.
Práticas recomendadas
Para o melhor desempenho, a Google recomenda os seguintes padrões:
Evite enviar um grande número de atualizações ou inserções de linhas individuais. Em alternativa, agrupe as operações DML sempre que possível. Para mais informações, consulte Declarações DML que atualizam ou inserem linhas únicas.
Se as atualizações ou as eliminações ocorrerem geralmente em dados mais antigos ou num intervalo de datas específico, considere particionar as tabelas. A partição garante que as alterações estão limitadas a partições específicas na tabela.
Evite particionar tabelas se a quantidade de dados em cada partição for pequena e cada atualização modificar uma grande parte das partições.
Se atualizar frequentemente linhas em que uma ou mais colunas se enquadram num intervalo restrito de valores, considere usar tabelas agrupadas. O clustering garante que as alterações se limitam a conjuntos específicos de blocos, o que reduz a quantidade de dados que têm de ser lidos e escritos. Segue-se um exemplo de uma declaração que filtra um intervalo de valores de colunas:
UPDATEUPDATE mydataset.mytable SET string_col = 'some string' WHERE id BETWEEN 54 AND 75;
Segue-se um exemplo semelhante que filtra uma pequena lista de valores de colunas:
UPDATE mydataset.mytable SET string_col = 'some string' WHERE id IN (54, 57, 60);
Considere o agrupamento na coluna
idnestes casos.Se precisar da funcionalidade OLTP, considere usar as consultas federadas do Cloud SQL, que permitem ao BigQuery consultar dados residentes no Cloud SQL.
Para resolver e evitar o erro de quota,
Too many DML statements outstanding against table,siga as orientações para este erro na página de resolução de problemas do BigQuery.
Para ver as práticas recomendadas para otimizar o desempenho das consultas, consulte o artigo Introdução à otimização do desempenho das consultas.
O que se segue?
- Para ver informações e exemplos de sintaxe DML, consulte o artigo Sintaxe DML.
- Saiba mais sobre a atualização de dados de tabelas particionadas através de DML.
- Para obter informações sobre a utilização de declarações DML em consultas agendadas, consulte o artigo Agendar consultas.