As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Use declarações em lote no Amazon Keyspaces
Você pode combinar várias DELETE operações INSERTUPDATE, e em uma BATCH declaração. LOGGEDos lotes são o padrão.
batch_statement ::= BEGIN [ UNLOGGED ] BATCH [ USING update_parameter( AND update_parameter)* ] modification_statement ( ';' modification_statement )* APPLY BATCH modification_statement ::= insert_statement | update_statement | delete_statement
Quando você executa uma instrução em lote, o driver combina todas as instruções do lote em uma única operação em lote.
Para decidir qual tipo de operação em lote usar, você pode considerar as diretrizes a seguir.
- Use lotes registrados quando:
-
-
Você precisa de garantias de transação atômica.
-
Latências um pouco mais altas são uma compensação aceitável.
-
- Use lotes não registrados quando:
-
-
Você precisa otimizar as operações de partição única.
-
Você quer reduzir a sobrecarga da rede.
-
Você tem requisitos de alto rendimento.
-
Para obter informações sobre cotas de demonstrativos em lote, consulteCotas para Amazon Keyspaces (para Apache Cassandra).
Lotes não registrados
Com lotes não registrados, o Amazon Keyspaces processa várias operações como uma única solicitação sem manter um log de lotes. Com uma operação em lote não registrada, é possível que algumas ações sejam bem-sucedidas e outras falhem. Os lotes não registrados são úteis quando você deseja:
-
Otimize as operações em uma única partição.
-
Reduza o tráfego da rede agrupando as solicitações relacionadas.
A sintaxe de um lote não registrado é semelhante à de um lote registrado, com a adição da palavra-chave. UNLOGGED
BEGIN UNLOGGED BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe'); INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Smith'); APPLY BATCH;
Lotes registrados
Um lote registrado combina várias ações de gravação em uma única operação atômica. Quando você executa um lote registrado:
-
Todas as ações são bem-sucedidas juntas ou fracassam juntas.
-
A operação é síncrona e idempotente.
-
Você pode gravar em várias tabelas do Amazon Keyspaces, desde que elas estejam na mesma AWS conta e. Região da AWS
Os lotes registrados podem ter latências um pouco maiores. Para aplicações de alto rendimento, considere usar lotes não registrados.
Não há custo adicional para usar lotes registrados no Amazon Keyspaces. Você paga somente pelas gravações que fazem parte de suas operações em lote. O Amazon Keyspaces executa duas gravações subjacentes de cada linha do lote: uma para preparar a linha para o lote e outra para confirmar o lote. Ao planejar a capacidade de tabelas que usam lotes registrados, lembre-se de que cada linha em um lote exige o dobro da capacidade de uma operação de gravação padrão. Por exemplo, se seu aplicativo executa um lote registrado por segundo com três linhas de 1 KB, você precisa provisionar seis unidades de capacidade de gravação (WCUs) em comparação com apenas três WCUs para gravações individuais ou lotes não registrados.
Para obter informações sobre preços, consulte o Amazon Keyspaces (para Apache Cassandra)
Use declarações preparadas em lotes registrados
Os lotes registrados suportam instruções preparadas (vinculadas) com execução atômica completa (tudo ou nada). Você pode combinar o desempenho das declarações preparadas com as garantias de atomicidade de um lote registrado.
Você pode criar um lote registrado de declarações preparadas de duas maneiras. Os exemplos a seguir usam um driver Java compatível com o Apache Cassandra.
Na primeira abordagem, você prepara cada declaração individualmente e adiciona as declarações vinculadas a BatchStatement a. Essa abordagem oferece suporte a lotes que abrangem várias tabelas na mesma AWS conta e. Região da AWS O exemplo de código Java a seguir mostra essa abordagem:
import com.datastax.driver.core.BatchStatement; import com.datastax.driver.core.PreparedStatement; import com.datastax.driver.core.Session; PreparedStatement psInsert = session.prepare( "INSERT INTO my_keyspace.orders (order_id, status) VALUES (?, ?)"); PreparedStatement psUpdate = session.prepare( "UPDATE my_keyspace.inventory SET qty = ? WHERE sku = ?"); BatchStatement batch = new BatchStatement(BatchStatement.Type.LOGGED); batch.add(psInsert.bind(orderId, "CONFIRMED")); batch.add(psUpdate.bind(newQty, sku)); try { session.execute(batch); } catch (Exception e) { // Handle the batch execution error. }
Na segunda abordagem, você prepara um BEGIN BATCH ... APPLY
BATCH bloco inteiro como uma única instrução e, em seguida, o vincula e executa. Essa abordagem é mais adequada para um lote cujos comandos têm como alvo uma única tabela. Para preparar um lote que abranja várias tabelas, use a primeira abordagem. O exemplo de código Java a seguir mostra como preparar um bloco de lote inteiro como uma única instrução:
import com.datastax.driver.core.PreparedStatement; import com.datastax.driver.core.Session; PreparedStatement psBatch = session.prepare( "BEGIN BATCH " + " INSERT INTO my_keyspace.orders (order_id, status) VALUES (?, ?); " + " INSERT INTO my_keyspace.orders (order_id, status) VALUES (?, ?); " + "APPLY BATCH"); try { session.execute(psBatch.bind(orderId1, "CONFIRMED", orderId2, "PENDING")); } catch (Exception e) { // Handle the batch execution error. }
Você também pode usar instruções preparadas em um lote registrado com o seguinte:
Declarações condicionais (
IF NOT EXISTSouIF)Marcadores de vinculação nomeados
Uma mistura de declarações preparadas e não preparadas no mesmo lote
Reutilização de uma única declaração preparada com diferentes valores vinculados em todo o lote
Práticas recomendadas para operações em lote
Considere as seguintes práticas recomendadas ao usar as operações em lote do Amazon Keyspaces.
-
Ative o escalonamento automático para que você tenha capacidade de produção suficiente para que suas tabelas lidem com operações em lote e com os requisitos adicionais de produtividade dos lotes registrados.
-
Use operações individuais ou lotes não registrados quando as operações puderem ser executadas de forma independente sem afetar a exatidão do aplicativo.
-
Projete seu aplicativo para minimizar as atualizações simultâneas nas mesmas linhas, pois as operações simultâneas em lote podem entrar em conflito e falhar.
-
Para ingestão de dados em massa de alto rendimento sem requisitos de atomicidade, use operações de gravação individuais ou lotes não registrados.
Consistência e simultaneidade
O Amazon Keyspaces impõe as seguintes regras de consistência e simultaneidade para lotes registrados:
-
Todas as operações em lote usam o nível de
LOCAL_QUORUMconsistência. -
Lotes simultâneos que afetam linhas diferentes podem ser executados simultaneamente.
As
DELETEoperaçõesINSERTUPDATEsimultâneas ou em linhas envolvidas em um lote em andamento falham com um conflito.
Operadores e condições compatíveis
- Operadores de
WHEREcláusulas compatíveis: -
Igualdade (=)
- Operadores não suportados:
-
Operadores de intervalo (>, <, >=, <=)
Operador
INOperador
LIKEOperador
BETWEEN
- Não suportado em lotes registrados:
-
Várias declarações afetando a mesma linha
Operações de contra-ataque
Exclusões de intervalo
Uma DELETE instrução em um lote registrado deve ter como alvo uma única linha especificando a chave primária completa (todas as chaves de partição e colunas de agrupamento) com condições de igualdade. Uma exclusão de intervalo, como uma exclusão por chave de partição sozinha ou em uma variedade de colunas de agrupamento, não é suportada em um lote registrado. Para executar uma exclusão de intervalo, use uma DELETE instrução independente ou um lote não registrado.
Condições de falha das declarações de lote registradas
Uma operação de lote registrada pode falhar em qualquer um dos seguintes casos:
-
Expressões de condição (como
IF NOT EXISTSouIF) são avaliadas como falsas. -
Uma ou mais operações contêm parâmetros inválidos.
-
A solicitação está em conflito com outra operação em lote em execução nas mesmas linhas.
-
A tabela não tem capacidade provisionada suficiente.
-
Uma linha excede o limite máximo de tamanho.
-
O formato dos dados de entrada é inválido.
Declarações em lote e replicação multirregional
Em implantações multirregionais:
-
As operações da região de origem são síncronas e atômicas.
-
As operações da região de destino são assíncronas.
-
Todas as operações em lote são replicadas para as regiões de destino, mas podem não manter o isolamento durante a aplicação.
Monitore as operações em lote
Você pode monitorar operações em lote usando CloudWatch métricas da Amazon para rastrear desempenho, erros e padrões de uso. O Amazon Keyspaces fornece as seguintes CloudWatch métricas para monitorar operações em lote por tabela:
SuccessfulRequestCount— Acompanhe operações em lote bem-sucedidas.Latency— Meça o desempenho da operação em lote.ConsumedWriteCapacityUnits— Monitore o consumo de capacidade das operações em lote.
Para obter mais informações, consulte Métricas do Amazon Keyspaces.
Além das CloudWatch métricas, você pode usar AWS CloudTrail para registrar todas as ações da API Amazon Keyspaces. Cada ação de API no lote é registrada, CloudTrail facilitando o rastreamento e a auditoria de operações em lote em suas tabelas do Amazon Keyspaces.
Exemplos de operação em lote
Veja a seguir um exemplo de uma declaração básica de lote registrado.
BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe'); INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Smith'); APPLY BATCH;
Esse é um exemplo de um lote que inclui INSERTUPDATE, e DELETE declarações.
BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe'); UPDATE users SET firstname = 'Johnny' WHERE id = 2; DELETE FROM users WHERE id = 3; APPLY BATCH;
Este é um exemplo de um lote usando carimbos de data/hora do lado do cliente.
BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Stiles') USING TIMESTAMP 1669069624; INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Doe') USING TIMESTAMP 1669069624; APPLY BATCH; BEGIN BATCH UPDATE users USING TIMESTAMP 1669069624 SET firstname = 'Carlos' WHERE id = 1; UPDATE users USING TIMESTAMP 1669069624 SET firstname = 'Diego' WHERE id = 2; APPLY BATCH;
Esse é um exemplo de lote condicional.
BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'Jane', 'Doe') IF NOT EXISTS; INSERT INTO users (id, firstname, lastname) VALUES (2, 'John', 'Doe') IF NOT EXISTS; APPLY BATCH; BEGIN BATCH UPDATE users SET lastname = 'Stiles' WHERE id = 1 IF lastname = 'Doe'; UPDATE users SET lastname = 'Stiles' WHERE id = 2 IF lastname = 'Doe'; APPLY BATCH;
Este é um exemplo de lote usando o Time to Live (TTL).
BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe') USING TTL 3600; INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Smith') USING TTL 7200; APPLY BATCH;
Esse é um exemplo de uma instrução em lote que atualiza várias tabelas.
BEGIN BATCH INSERT INTO users (id, firstname) VALUES (1, 'John'); INSERT INTO user_emails (user_id, email) VALUES (1, 'john@example.com'); APPLY BATCH;
Esse é um exemplo de operação em lote usando tipos definidos pelo usuário (UDTs). O exemplo pressupõe que o UDT address exista.
BEGIN BATCH INSERT INTO users (id, firstname, address) VALUES (1, 'John', {street: '123 Main St', city: 'NYC', zip: '10001'}); INSERT INTO users (id, firstname, address) VALUES (2, 'Jane', {street: '456 Oak Ave', city: 'LA', zip: '90210'}); APPLY BATCH; BEGIN BATCH UPDATE users SET address.zip = '10002' WHERE id = 1; UPDATE users SET address.city = 'Boston' WHERE id = 2; APPLY BATCH;