Prácticas recomendadas para el lenguaje de manipulación de datos

En esta página, se describen las prácticas recomendadas para usar el lenguaje de manipulación de datos (DML) y el DML particionado.

Usa una cláusula WHERE para reducir el alcance de los bloqueos

Las declaraciones DML se pueden ejecutar dentro de transacciones de lectura y escritura. Cuando Cloud Spanner lee datos, adquiere bloqueos de lectura compartidos en partes limitadas de los rangos de fila que lees. En particular, adquiere estos bloqueos solo en las columnas a las que accedes. Los bloqueos pueden incluir datos que no coincidan con la condición del filtro de la cláusula WHERE.

Cuando Cloud Spanner modifica los datos mediante declaraciones DML, adquiere bloqueos exclusivos en los datos específicos que estás modificando. Además, adquiere bloqueos compartidos de la misma manera que cuando lees datos. Si tu solicitud incluye grandes rangos de filas o una tabla completa, es posible que los bloqueos compartidos impidan que otras transacciones se completen en paralelo.

Para modificar los datos de la manera más eficiente posible, usa una cláusula WHERE que permita a Cloud Spanner leer solo las filas necesarias. Puedes lograr este objetivo con un filtro en la clave primaria o en la clave de un índice secundario. La cláusula WHERE limita el alcance de los bloqueos compartidos y permite a Cloud Spanner procesar la actualización de manera más eficiente.

Por ejemplo, supongamos que uno de los músicos de la tabla Singers cambia su nombre y tienes que actualizarlo en tu base de datos. Puedes ejecutar la siguiente declaración DML, pero eso obliga a Cloud Spanner a analizar toda la tabla y a adquirir bloqueos compartidos que cubran la tabla completa. Como resultado, Cloud Spanner debe leer más datos de los necesarios, y las transacciones simultáneas no pueden modificar los datos en paralelo:

-- ANTI-PATTERN: SENDING AN UPDATE WITHOUT THE PRIMARY KEY COLUMN
-- IN THE WHERE CLAUSE

UPDATE Singers SET FirstName = "Marcel"
WHERE FirstName = "Marc" AND LastName = "Richards";

Para que la actualización sea más eficiente, incluye la columna SingerId en la cláusula WHERE. La columna SingerId es la única columna de clave primaria de la tabla Singers:

-- RECOMMENDED: INCLUDING THE PRIMARY KEY COLUMN IN THE WHERE CLAUSE

UPDATE Singers SET FirstName = "Marcel"
WHERE FirstName = "Marc" AND LastName = "Richards" AND SingerId = 1;

No uses declaraciones de DML ni mutaciones en la misma transacción

Cloud Spanner almacena en búfer las inserciones, actualizaciones y eliminaciones que se realizaron mediante declaraciones DML del lado del servidor, y los resultados son visibles para las instrucciones de SQL y las declaraciones de DML posteriores dentro de la misma transacción. Este comportamiento es diferente a la API de mutación, en la que Cloud Spanner almacena en búfer las mutaciones del lado del cliente y envía las del lado del servidor como parte de la operación de confirmación. Como resultado, las mutaciones de la solicitud de confirmación no son visibles para las instrucciones de SQL o declaraciones de DML dentro de la misma transacción.

Recomendamos combinar mutaciones y declaraciones DML en la misma transacción, ya que algunas operaciones solo se admiten en la API de mutación. Un ejemplo es insert_or_update. Si una transacción contiene mutaciones y declaraciones DML en la solicitud de confirmación, Cloud Spanner ejecuta las declaraciones DML antes de las mutaciones. Para evitar tener que dar cuenta del orden de ejecución en el código de tu biblioteca cliente, debes usar las declaraciones DML o las mutaciones en una sola transacción, pero no en ambas. Si usas ambas opciones, debes almacenar las escrituras en búfer solo al final de la transacción.

Usa la función PENDING_COMMIT_TIMESTAMP para escribir marcas de tiempo de confirmación

Usa la función PENDING_COMMIT_TIMESTAMP para escribir la marca de tiempo de confirmación en una declaración DML. Cloud Spanner selecciona la marca de tiempo de confirmación cuando se confirma la transacción.

DML particionado y funciones de fecha y marca de tiempo

El DML particionado usa una o más transacciones que pueden ejecutarse y confirmarse en momentos diferentes. Si usas las funciones de fecha o marca de tiempo, las filas modificadas pueden contener valores diferentes.

Usa DML por lotes para enviar varios DML en una sola solicitud.

Usa DML por lotes para enviar varios DML en una sola solicitud. De esta manera, solo se necesita un recorrido de ida y vuelta al servidor del cliente, lo que reduce la latencia.