Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Utilice declaraciones por lotes en Amazon Keyspaces
Puede combinar varias INSERT DELETE operaciones y en una BATCH sola declaración. UPDATE LOGGEDlos lotes son los predeterminados.
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
Al ejecutar un extracto por lotes, el controlador combina todos los extractos del lote en una sola operación por lotes.
Para decidir qué tipo de operación por lotes usar, puede tener en cuenta las siguientes pautas.
- Utilice lotes registrados cuando:
-
-
Necesita garantías de transacciones atómicas.
-
Las latencias ligeramente más altas son una compensación aceptable.
-
- Utilice lotes sin registrar cuando:
-
-
Necesita optimizar las operaciones de una sola partición.
-
Desea reducir la sobrecarga de la red.
-
Tiene requisitos de alto rendimiento.
-
Para obtener información sobre las cuotas de declaraciones por lotes, consulteCuotas para Amazon Keyspaces (para Apache Cassandra).
Lotes no registrados
Con los lotes sin registrar, Amazon Keyspaces procesa varias operaciones como una sola solicitud sin mantener un registro de lotes. En el caso de una operación por lotes sin registrar, es posible que algunas de las acciones se realicen correctamente y otras fallen. Los lotes no registrados son útiles cuando deseas:
-
Optimizar las operaciones dentro de una sola partición.
-
Reduzca el tráfico de red agrupando las solicitudes relacionadas.
La sintaxis de un lote sin registrar es similar a la de un lote registrado, con la adición de la UNLOGGED palabra clave.
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
Un lote registrado combina varias acciones de escritura en una sola operación atómica. Cuando ejecutas un lote registrado:
-
Todas las acciones tienen éxito juntas o fallan juntas.
-
La operación es sincrónica e idempotente.
-
Puede escribir en varias tablas de Amazon Keyspaces, siempre que estén en la misma cuenta y. AWS Región de AWS
Los lotes registrados pueden tener latencias ligeramente superiores. Para aplicaciones de alto rendimiento, considere la posibilidad de utilizar lotes no registrados.
El uso de lotes registrados en Amazon Keyspaces no conlleva ningún coste adicional. Solo paga por las escrituras que forman parte de sus operaciones por lotes. Amazon Keyspaces realiza dos escrituras subyacentes de cada fila del lote: una para preparar la fila para el lote y otra para confirmarlo. Al planificar la capacidad de las tablas que utilizan lotes registrados, recuerde que cada fila de un lote requiere el doble de capacidad que una operación de escritura estándar. Por ejemplo, si su aplicación ejecuta un lote registrado por segundo con tres filas de 1 KB, debe aprovisionar seis unidades de capacidad de escritura (WCU), en lugar de solo tres para escrituras individuales o lotes no registrados.
Para obtener información sobre precios, consulte Precios de Amazon Keyspaces (para Apache Cassandra)
Utilice sentencias preparadas en lotes registrados
Los lotes registrados admiten sentencias preparadas (encuadernadas) con una ejecución atómica completa (todo o nada). Puede combinar el rendimiento de las sentencias preparadas con las garantías de atomicidad de un lote registrado.
Puede crear un lote registrado de sentencias preparadas de dos maneras. Los siguientes ejemplos utilizan un controlador Java que es compatible con Apache Cassandra.
En el primer enfoque, se prepara cada sentencia de forma individual y se añaden las sentencias encuadernadas a unaBatchStatement. Este enfoque admite lotes que abarcan varias tablas en la misma AWS cuenta y Región de AWS. El siguiente ejemplo de código Java muestra este enfoque:
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. }
En el segundo enfoque, se prepara un BEGIN BATCH ... APPLY
BATCH bloque completo como una sentencia única y, a continuación, se enlaza y se ejecuta. Este enfoque es el más adecuado para un lote cuyas sentencias se dirigen a una sola tabla. Para preparar un lote que abarque varias tablas, utilice el primer enfoque. El siguiente ejemplo de código Java muestra cómo preparar un bloque de lote completo como una sola sentencia:
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. }
También puedes usar sentencias preparadas en un lote registrado con lo siguiente:
Declaraciones condicionales (
IF NOT EXISTSoIF)Marcadores de enlace con nombre
Una combinación de declaraciones preparadas y no preparadas en el mismo lote
Reutilización de una única declaración preparada con diferentes valores encuadernados en todo el lote
Mejores prácticas para las operaciones por lotes
Tenga en cuenta las siguientes prácticas recomendadas cuando utilice las operaciones por lotes de Amazon Keyspaces.
-
Habilite el escalado automático para disponer de la capacidad de procesamiento suficiente para que sus tablas puedan gestionar las operaciones por lotes y los requisitos de rendimiento adicionales de los lotes registrados.
-
Utilice operaciones individuales o lotes no registrados cuando las operaciones puedan ejecutarse de forma independiente sin afectar a la corrección de las aplicaciones.
-
Diseñe su aplicación para minimizar las actualizaciones simultáneas en las mismas filas, ya que las operaciones por lotes simultáneas pueden entrar en conflicto y fallar.
-
Para una ingestión masiva de datos de alto rendimiento sin requisitos de atomicidad, utilice operaciones de escritura individuales o lotes no registrados.
Coherencia y simultaneidad
Amazon Keyspaces aplica las siguientes reglas de coherencia y simultaneidad para los lotes registrados:
-
Todas las operaciones por lotes utilizan un nivel de coherencia.
LOCAL_QUORUM -
Los lotes simultáneos que afectan a diferentes filas pueden ejecutarse simultáneamente.
DELETELas operacionesINSERTsimultáneasUPDATEo en las filas de un lote en curso fallan debido a un conflicto.
Operadores y condiciones compatibles
- Operadores de
WHEREcláusulas compatibles: -
Igualdad (=)
- Operadores no compatibles:
-
Operadores de rango (>, <, >=, < =)
operador
INoperador
LIKEoperador
BETWEEN
- No se admite en lotes registrados:
-
Varias sentencias que afectan a la misma fila
Operaciones de contraataque
Borra un rango
Una DELETE sentencia de un lote registrado debe apuntar a una sola fila especificando la clave principal completa (todas las columnas de claves de partición y agrupamiento) con condiciones de igualdad. En un lote registrado, no se admite la eliminación de rangos, como la eliminación solo por clave de partición o en un rango de columnas agrupadas en clústeres. Para eliminar un rango, usa una DELETE sentencia independiente o un lote no registrado.
Condiciones de error de las declaraciones de lotes registradas
Una operación por lotes registrada puede fallar en cualquiera de los siguientes casos:
-
Las expresiones de condición (como
IF NOT EXISTSoIF) se evalúan como falsas. -
Una o más operaciones contienen parámetros no válidos.
-
La solicitud entra en conflicto con otra operación por lotes que se ejecuta en las mismas filas.
-
La tabla carece de capacidad aprovisionada suficiente.
-
Una fila supera el límite de tamaño máximo.
-
El formato de los datos de entrada no es válido.
Expresiones por lotes y replicación multirregional
En las implementaciones multirregionales:
-
Las operaciones en la región de origen son sincrónicas y atómicas.
-
Las operaciones de la región de destino son asincrónicas.
-
Todas las operaciones por lotes se replican en las regiones de destino, pero es posible que no se mantengan aisladas durante la aplicación.
Supervise las operaciones por lotes
Puedes supervisar las operaciones por lotes utilizando las CloudWatch métricas de Amazon para hacer un seguimiento del rendimiento, los errores y los patrones de uso. Amazon Keyspaces proporciona las siguientes CloudWatch métricas para supervisar las operaciones por lotes por tabla:
SuccessfulRequestCount— Realice un seguimiento de las operaciones por lotes exitosas.Latency— Mida el rendimiento de las operaciones por lotes.ConsumedWriteCapacityUnits— Supervise el consumo de capacidad de las operaciones por lotes.
Para obtener más información, consulte Métricas de Amazon Keyspaces.
Además de las CloudWatch métricas, puede utilizarlas AWS CloudTrail para registrar todas las acciones de la API de Amazon Keyspaces. Se registra cada acción de la API del lote, lo CloudTrail que facilita el seguimiento y la auditoría de las operaciones por lotes en las tablas de Amazon Keyspaces.
Ejemplos de operaciones por lotes
A continuación se muestra un ejemplo de una declaración de lotes registrada básica.
BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe'); INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Smith'); APPLY BATCH;
Este es un ejemplo de un lote que incluye DELETE declaraciones INSERTUPDATE, y.
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 es un ejemplo de un lote que usa marcas de tiempo del lado del 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;
Este es un ejemplo de un 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 es un ejemplo de un lote que utiliza 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;
Este es un ejemplo de una declaración por lotes que actualiza varias tablas.
BEGIN BATCH INSERT INTO users (id, firstname) VALUES (1, 'John'); INSERT INTO user_emails (user_id, email) VALUES (1, 'john@example.com'); APPLY BATCH;
Este es un ejemplo de una operación por lotes que utiliza tipos definidos por el usuario (UDT). En el ejemplo se presupone que la address UDT existe.
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;