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.insertall
com a linguagem de manipulação de dados (DML), como as declaraçõesUPDATE
,DELETE
,MERGE
ouTRUNCATE
. As gravações recentes são as que ocorreram nos últimos 30 minutos. Todas as outras linhas na tabela permanecem modificáveis através das declaraçõesUPDATE
,DELETE
,MERGE
ouTRUNCATE
. Os dados transmitidos podem demorar até 90 minutos a ficar disponíveis para operações de cópia.Em alternativa, as linhas escritas recentemente com a API Storage Write podem ser modificadas através das declarações
UPDATE
,DELETE
ouMERGE
. Para mais informações, consulte o artigo Use a linguagem de manipulação de dados (DML) com dados transmitidos recentemente.As subconsultas correlacionadas numa declaração
when_clause
,search_condition
,merge_update_clause
oumerge_insert_clause
nã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
FROM
de 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
As instruções DML de mutação que são executadas em simultâneo numa tabela causam 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
INSERT
instruçã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
MERGE
nã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çõesMERGE
com cláusulasUPDATE
ouDELETE
, 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 declarações UPDATE
, DELETE
e MERGE
(também conhecidas como declarações DML mutantes). Sem o DML detalhado ativado, as mutações são realizadas ao nível do grupo de ficheiros, o que pode levar a reescritas de dados ineficientes. A DML detalhada introduz uma abordagem mais detalhada que
visa reduzir a quantidade de dados que têm de ser reescritos e reduzir
o consumo geral de espaços.
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 a partir de uma tabela existente, use a declaração ALTER TABLE
.
ALTER TABLE mydataset.mytable SET OPTIONS(enable_fine_grained_mutations = FALSE);
Quando desativa o DML detalhado, o processamento completo de todos os dados eliminados pode demorar algum tempo. 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 de armazenamento do BigQuery adicionais para armazenar os metadados de mutação adicionais associados a operações DML detalhadas. O custo real depende da quantidade de dados que são modificados, mas, na maioria das situações, espera-se que seja insignificante em comparação com o tamanho da própria tabela.
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 processa uma parte dos dados eliminados e o sistema também transfere o processamento restante para segundo plano. Estas tarefas de tratamento de dados eliminadas incorrem em custos de computação do BigQuery adicionais.
Pode usar reservas do BigQuery para alocar recursos de computação do BigQuery dedicados para estas tarefas de processamento de dados eliminados offline. As reservas permitem-lhe definir um limite para o custo de realização destas operações. Esta abordagem é particularmente útil para tabelas muito grandes com operações DML de mutação detalhadas frequentes, que, de outra forma, teriam custos a pedido elevados devido ao grande número de bytes processados quando executam cada tarefa de processamento de dados eliminados detalhados offline.
As tarefas de tratamento de dados eliminados detalhados offline são consideradas tarefas em segundo plano
e usam o
BACKGROUND
tipo de atribuição,
em vez do
QUERY
tipo de atribuição.
Os projetos que executam operações DML detalhadas sem um processo de atribuição BACKGROUND
eliminaram dados através dos preços a pedido.
Para projetos configurados para usar os preços de computação a pedido, as declarações de DML detalhadas não reduzem os bytes analisados.
Para encontrar os trabalhos de processamento de dados de DML detalhados offline eliminados:
SELECT * FROM region-us.INFORMATION_SCHEMA.JOBS WHERE job_id LIKE "%fine_grained_mutation_garbage_collection%"
Se a tabela receber um grande número de tarefas de DML, o tratamento dos dados eliminados pode ser processado inteiramente por DMLs, eliminando a necessidade de tratamento em segundo plano.
Considerações sobre 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 de
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.
Limitações
As tabelas ativadas com DML detalhado estão sujeitas às seguintes limitações:
- Não pode usar o método
tabledata.list
para ler conteúdo de uma tabela com DML detalhado ativado. Em alternativa, consulte a tabela com uma declaraçãoSELECT
para 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
,DELETE
ouMERGE
. - 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
,DELETE
ouMERGE
. - 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 agrupamento 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:
UPDATE
UPDATE 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);
Pondere agrupar pela coluna
id
nestes casos.Se precisar da funcionalidade OLTP, considere usar as consultas federadas do Cloud SQL, que permitem ao BigQuery consultar dados que residem no Cloud SQL.
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.