A linguagem de manipulação de dados particionada (DML particionada) foi projetada para os seguintes tipos de atualizações e exclusões em massa:
- Limpeza periódica e coleta de lixo. Alguns exemplos são excluir linhas antigas ou definir colunas como
NULL
. - Preenchimento de novas colunas com valores padrão. Um exemplo é o uso de uma instrução
UPDATE
para definir o valor de uma nova coluna comoFalse
, no qual o valor atual éNULL
.
A DML particionada não é adequada para processamento de transações em pequena escala. Se você quiser executar uma instrução em algumas linhas, use DMLs transacionais com chaves primárias identificáveis. Para mais informações, consulte Como usar a DML.
Se você precisar confirmar um grande número de gravações cegas, mas não exigir uma transação atômica, modifique em massa as tabelas do Spanner usando a gravação em lote. Para mais informações, consulte Modificar dados usando gravações em lote.
É possível receber insights sobre consultas de DML particionadas ativas e o progresso delas nas tabelas de estatísticas no banco de dados do Spanner. Para mais informações, consulte Estatísticas de DMLs particionadas ativas.
DML e DML particionada
O Spanner é compatível com dois modos de execução para instruções DML:
DML, que é adequada para o processamento de transações. Para mais informações, consulte Como usar a DML.
DML particionada, que permite operações em grande escala em todo o banco de dados com impacto mínimo no processamento de transações simultâneas particionando o espaço de chave e executando a instrução por partições em transações separadas e de escopo menor. Para mais informações, consulte Como usar DML particionada.
A tabela a seguir destaca algumas das diferenças entre os dois modos de execução.
DML | DML particionada |
---|---|
Linhas que não correspondem à cláusula WHERE podem ser bloqueadas. |
Apenas as linhas que correspondem à cláusula WHERE são bloqueadas. |
Limites de tamanho de transação são aplicáveis. | O Spanner lida com os limites de transação e os limites de simultaneidade por transação. |
As instruções não precisam ser idempotentes. | Uma instrução DML precisa ser idempotente para garantir resultados consistentes. |
Uma transação pode incluir várias declarações DML e instruções SQL. | Uma transação particionada pode incluir apenas uma declaração DML. |
Não há restrições à complexidade das declarações. | As declarações precisam ser totalmente particionáveis. |
Você cria transações de leitura/gravação no seu código de cliente. | O Spanner cria as transações. |
Particionável e idempotente
Quando uma instrução DML particionada é executada, as linhas em uma partição não têm acesso a linhas em outras partições e não é possível escolher como o Spanner cria as partições. O particionamento garante a escalonabilidade, mas também significa que as declarações DML particionadas precisam ser totalmente particionáveis. Ou seja, a instrução DML particionada precisa ser expressa como a união de um conjunto de instruções, em que cada instrução acessa uma única linha da tabela e cada instrução não acessa outras tabelas. Por exemplo, uma instrução DML que acessa várias tabelas ou realiza uma união automática não é particionável. Se a instrução DML não puder ser particionada, o Spanner retornará o erro BadUsage
.
Estas instruções DML são totalmente particionáveis porque cada uma pode ser aplicada a uma única linha na tabela:
UPDATE Singers SET LastName = NULL WHERE LastName = '';
DELETE FROM Albums WHERE MarketingBudget > 10000;
Esta instrução DML não é totalmente particionável, porque acessa várias tabelas:
# Not fully partitionable
DELETE FROM Singers WHERE
SingerId NOT IN (SELECT SingerId FROM Concerts);
O Spanner pode executar uma instrução DML particionada várias vezes em algumas partições devido a novas tentativas no nível da rede. Como resultado, uma instrução pode ser executada mais de uma vez em uma linha. A instrução precisa, portanto, ser idempotente para produzir resultados consistentes. Uma instrução é idempotente se executá-la várias vezes em uma única linha levar ao mesmo resultado.
Esta instrução DML é idempotente:
UPDATE Singers SET MarketingBudget = 1000 WHERE true;
Esta não é:
UPDATE Singers SET MarketingBudget = 1.5 * MarketingBudget WHERE true;
Bloqueio de linhas
O Spanner adquire um bloqueio somente se uma linha é candidata a atualização ou exclusão. Esse comportamento é diferente da
execução de DML, que pode bloquear a leitura
de linhas que não correspondem à cláusula WHERE
.
Execução e transações
Se uma declaração DML é particionada ou não, depende do método da biblioteca de cliente que você escolhe para execução. Cada biblioteca de cliente fornece métodos separados para execução de DML e execução de DML particionada.
Você pode executar apenas uma instrução DML particionada em uma chamada para o método da biblioteca de cliente.
O Spanner não aplica as instruções DML particionadas atomicamente em toda a tabela. No entanto, o Spanner aplica instruções DML particionadas atomicamente em cada partição.
A DML particionada não é compatível com consolidação ou reversão. O Spanner executa e aplica a instrução DML imediatamente.
- Se você cancelar a operação, o Spanner cancelará as partições em execução e não iniciará as partições restantes. O Spanner não reverter nenhuma partição que já tenha sido executada.
- Se a execução da instrução causar um erro, a execução será interrompida em todas as partições e o Spanner retornará esse erro para toda a operação. Alguns exemplos de erros são violações de restrições de tipo de dados, violações de
UNIQUE INDEX
e violações deON DELETE NO ACTION
. Dependendo do momento em que a execução falhou, a instrução pode ter sido executada com êxito em algumas partições e pode nunca ter sido executada em outras.
Se a instrução DML particionada for bem-sucedida, o Spanner executará a instrução pelo menos uma vez em cada partição do intervalo de chaves.
Contagem de linhas modificadas
Uma instrução DML particionada retorna um limite inferior para o número de linhas modificadas. Pode não ser uma contagem exata do número de linhas modificadas, porque não há garantia de que o Spanner conte todas as linhas modificadas.
Limites de transação
O Spanner cria as partições e transações necessárias para executar uma instrução DML particionada. Limites de transação ou limites de simultaneidade por transação se aplicam, mas o Spanner tenta manter as transações dentro dos limites.
O Spanner permite no máximo 20.000 instruções DML particionadas simultâneas por banco de dados.
Recursos não compatíveis
O Spanner não oferece suporte a alguns recursos para DML particionada:
INSERT
não é compatível.- Console do Google Cloud: não é possível executar instruções DML particionadas no console do Google Cloud.
- Planos de consulta e criação de perfil: a CLI do Google Cloud e as bibliotecas de cliente não são compatíveis com planos de consulta e criação de perfil.
- Subconsultas que leem de outra tabela ou de uma linha diferente da mesma tabela.
Para cenários complexos, como mover uma tabela ou transformações que exigem mesclagens entre tabelas, considere usar o conector do Dataflow.
Examples
O exemplo de código a seguir atualiza a coluna MarketingBudget
da tabela Albums
.
C++
Use a função ExecutePartitionedDml()
para executar uma instrução DML particionada.
C#
Use o método ExecutePartitionedUpdateAsync()
para executar uma instrução DML particionada.
Go
Use o método PartitionedUpdate()
para executar uma instrução DML particionada.
Java
Use o método executePartitionedUpdate()
para executar uma instrução DML particionada.
Node.js
Use o método runPartitionedUpdate()
para executar uma instrução DML particionada.
PHP
Use o método executePartitionedUpdate()
para executar uma instrução DML particionada.
Python
Use o método execute_partitioned_dml()
para executar uma instrução DML particionada.
Ruby
Use o método execute_partitioned_update()
para executar uma instrução DML particionada.
O exemplo de código a seguir exclui linhas da tabela Singers
com base na coluna SingerId
.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
A seguir
Saiba como modificar dados usando a DML.
Saiba mais sobre as práticas recomendadas da linguagem de manipulação de dados (DML, na sigla em inglês).
Para saber mais sobre as diferenças entre DML e mutações, consulte Comparar DML e mutações
Considere usar o conector do Dataflow para outros cenários de transformação de dados.