Lenguaje de manipulación de datos particionado (particionada) DML) está diseñado para los siguientes tipos de actualizaciones y eliminaciones masivas:
- Recolección de elementos no usados y limpieza periódicos. Por ejemplo, la eliminación de filas antiguas o la configuración de columnas como
NULL
. - El restablecimiento de columnas nuevas con valores predeterminados. Un ejemplo es el uso de una declaración
UPDATE
para configurar el valor de una columna nueva comoFalse
si, en el momento, se encuentra comoNULL
.
El DML particionado no es adecuado para el procesamiento de transacciones a pequeña escala. Si ejecutar una declaración en unas cuantas filas, usar DML transaccionales con claves primarias. Para obtener más información, consulta Cómo usar DML.
Si necesitas confirmar una gran cantidad de operaciones de escritura ciegas, pero no requieres una transacción atómica, puedes modificar de forma masiva tus tablas de Spanner con la operación de escritura en lotes. Para obtener más información, consulta Modifica datos con escrituras por lotes.
Puedes obtener estadísticas sobre consultas DML particionadas activas y su progreso desde las tablas de estadísticas de tu base de datos de Spanner. Para obtener más información, consulta Estadísticas de DML particionadas activas.
DML y DML particionado
Spanner admite dos modos de ejecución para las sentencias DML:
DML, que es adecuado para el procesamiento de transacciones. Para obtener más información, consulta la sección sobre cómo usar DML.
DML particionado, que permite operaciones a gran escala en toda la base de datos con impacto mínimo en el procesamiento simultáneo de transacciones mediante la partición de la clave espacio y ejecutar la sentencia en particiones en particiones separadas y de menor alcance transacciones de contenedores. Para obtener más información, consulta Cómo usar DML particionado.
En la siguiente tabla, se destacan algunas de las diferencias entre los dos modos de ejecución.
DML | DML particionado |
---|---|
Es posible que las filas que no coincidan con la cláusula WHERE estén bloqueadas. |
Solo se bloquean las filas que coinciden con la cláusula WHERE . |
Se aplican los límites de tamaño de transacciones. | Spanner controla los límites de transacciones y los límites de simultaneidad por transacción. |
No es necesario que las declaraciones sean idempotentes. | Una declaración DML debe ser idempotente para garantizar resultados coherentes. |
Una transacción puede incluir varias instrucciones de SQL y declaraciones DML. | Una transacción particionada solo puede incluir una declaración DML. |
No hay restricciones para la complejidad de las declaraciones. | Las declaraciones deben poder particionarse por completo. |
Las transacciones de lectura y escritura se crean en el código del cliente. | Spanner crea las transacciones. |
Particionable e idempotente
Cuando se ejecuta una declaración DML particionada, las filas de una partición no tienen acceso
a filas de otras particiones, y no puedes elegir cómo Spanner
las particiones. La partición garantiza la escalabilidad, pero también significa que
Las declaraciones DML particionadas deben ser completamente particionables. Es decir,
La declaración DML particionada debe expresarse como la unión de un conjunto de
de estado, en las que cada instrucción accede a una sola fila de la tabla y cada una
no accede a otras tablas. Por ejemplo, una declaración DML que accede a varias tablas o realiza una unión de tabla con sí misma no es particionable. Si el archivo DML
no se puede particionar, Spanner muestra el error
BadUsage
Estas declaraciones DML se pueden particionar por completo, ya que cada una se puede aplicar a una sola fila de la tabla:
UPDATE Singers SET LastName = NULL WHERE LastName = '';
DELETE FROM Albums WHERE MarketingBudget > 10000;
Esta declaración DML no se puede particionar por completo, ya que accede a varias tablas:
# Not fully partitionable
DELETE FROM Singers WHERE
SingerId NOT IN (SELECT SingerId FROM Concerts);
Spanner podría ejecutar una declaración DML particionada varias veces en algunas particiones debido a reintentos a nivel de la red. Como resultado, una declaración podría ejecutarse más de una vez en una fila. Por lo tanto, la declaración debe ser idempotente para obtener resultados coherentes. Una declaración es idempotente si, cuando se ejecuta varias veces en una sola fila, genera el mismo resultado.
Esta declaración DML es idempotente:
UPDATE Singers SET MarketingBudget = 1000 WHERE true;
Esta declaración DML no es idempotente:
UPDATE Singers SET MarketingBudget = 1.5 * MarketingBudget WHERE true;
Bloqueo de fila
Spanner adquiere un bloqueo solo si una fila es candidata para actualizaciones o
o la eliminación del contenido. Este comportamiento es diferente del
Ejecución de DML, que podría bloquearse como de lectura
las filas que no coinciden con la cláusula WHERE
.
Ejecución y transacciones
En función del método de la biblioteca cliente que elijas para la ejecución, una declaración DML estará particionada o no. Cada biblioteca cliente proporciona distintos métodos para la ejecución de DML y la ejecución de DML particionado.
Puedes ejecutar solo una declaración DML particionada en una llamada al cliente método de biblioteca.
Spanner no aplica las declaraciones DML particionadas de forma atómica en toda la tabla. Sin embargo, Spanner aplica particiones Declaraciones DML de forma atómica en cada partición.
El DML particionado no admite la confirmación ni la reversión. Spanner ejecuta y aplica la declaración DML de inmediato.
- Si cancelas la operación, Spanner cancela las particiones en ejecución y no inicia las restantes. Spanner no revierte ninguna partición que ya se haya ejecutado.
- Si la ejecución de la sentencia provoca un error, la ejecución se detiene en todas las particiones y Spanner muestra ese error en toda la operación. Algunos ejemplos de errores son los incumplimientos de las restricciones de tipo de datos, de
UNIQUE INDEX
y deON DELETE NO ACTION
. Según el momento en el que falló la ejecución, el podría haberse ejecutado correctamente en algunas particiones y podría nunca se ejecutaron en otras particiones.
Si la declaración DML particionada se ejecuta correctamente, Spanner ejecutó el al menos una vez en cada partición del rango de claves.
Recuento de filas modificadas
Una declaración DML particionada muestra un límite inferior en la cantidad de filas modificadas. Es posible que no sea un recuento exacto de la cantidad de filas modificadas, ya que no hay garantía de que Spanner cuente todas las filas modificadas.
Límites de transacciones
Spanner crea las particiones y transacciones que necesita para ejecutar una declaración DML particionada. Se aplican los límites de transacciones o los límites de simultaneidad por transacción, pero Spanner intenta mantener las transacciones dentro de los límites.
Spanner permite un máximo de 20,000 Declaraciones DML particionadas simultáneas por base de datos.
Características no compatibles
Spanner no admite algunas funciones para el DML particionado:
INSERT
no es compatible.- Consola de Google Cloud: No puedes ejecutar declaraciones DML particionadas en Consola de Google Cloud
- Creación de perfiles y planes de consulta: La CLI de Google Cloud y las bibliotecas cliente no son compatibles con la creación de perfiles y los planes de consulta.
- Subconsultas que leen de otra tabla o de una fila diferente de la misma tabla
Para situaciones complejas, como mover una tabla o transformaciones que requieren uniones entre tablas, considera usar el conector de Dataflow.
Ejemplos
En el siguiente ejemplo de código, se actualiza la columna MarketingBudget
de la tabla Albums
.
C++
Usa la función ExecutePartitionedDml()
para ejecutar una declaración DML particionada.
C#
Usa el método ExecutePartitionedUpdateAsync()
para ejecutar una declaración DML particionada.
Go
Usa el método PartitionedUpdate()
para ejecutar una declaración DML particionada.
Java
Usa el método executePartitionedUpdate()
para ejecutar una declaración DML particionada.
Node.js
Usa el método runPartitionedUpdate()
para ejecutar una declaración DML particionada.
PHP
Usa el método executePartitionedUpdate()
para ejecutar una declaración DML particionada.
Python
Usa el método execute_partitioned_dml()
para ejecutar una declaración DML particionada.
Ruby
Usa el método execute_partitioned_update()
para ejecutar una declaración DML particionada.
En el siguiente ejemplo de código, se borran las filas de la tabla Singers
según la columna SingerId
.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Próximos pasos
Obtén información para modificar datos con DML.
Obtén información sobre las prácticas recomendadas para el lenguaje de manipulación de datos (DML).
Para obtener más información sobre las diferencias entre el DML y las mutaciones, consulta el artículo Comparación entre el DML y las mutaciones.
Considera usar el conector de Dataflow para otras transformaciones de datos reales.