Cette page explique comment insérer, mettre à jour et supprimer des données Spanner à l'aide d'instructions LMD (langage de manipulation de données). Vous pouvez exécuter des instructions LMD via les bibliothèques clientes, Google Cloud Console et l'outil de ligne de commande gcloud
. Vous pouvez exécuter des instructions en LMD partitionné via les bibliothèques clientes et l'outil de ligne de commande gcloud
.
Pour obtenir une description complète de la syntaxe LMD, consultez Syntaxe du langage de manipulation de données pour les bases de données utilisant le langage GoogleSQL ou langage de manipulation de données PostgreSQL pour les bases de données de dialecte PostgreSQL
Utiliser le LMD
Le LMD accepte les instructions INSERT
, UPDATE
et DELETE
dans le
la console Google Cloud, la Google Cloud CLI et les bibliothèques clientes.
Verrouillage
Les instructions LMD sont exécutées dans les transactions de lecture-écriture. Lorsque Spanner lit les données,
acquiert des verrous en lecture partagés sur les parties limitées des plages de lignes que vous lisez. Plus précisément, il n'acquiert ces verrous que sur les colonnes auxquelles vous accédez. Les verrous peuvent inclure des données
remplissent la condition de filtre de la clause WHERE
.
Lorsque Spanner modifie des données à l'aide d'instructions LMD, il acquiert des verrous exclusifs sur les données spécifiques que vous modifiez. De plus, il acquiert des verrous partagés de la même manière que lorsque vous consultez des données. Si votre requête inclut de grandes plages de lignes ou une table entière, les verrous partagés peuvent empêcher les autres transactions de progresser en parallèle.
Pour modifier les données le plus efficacement possible, utilisez une clause WHERE
qui active
Spanner pour ne lire que les lignes nécessaires. Pour ce faire, appliquez un filtre sur la clé primaire ou sur la clé d'un index secondaire. La clause WHERE
limite le champ d'application des verrous partagés et permet à Spanner de traiter la modification plus efficacement.
Par exemple, imaginons que l'un des musiciens de la table Singers
change de prénom et que vous deviez mettre à jour ce prénom dans votre base de données. Vous pouvez exécuter l'instruction LMD suivante, mais elle oblige Spanner à analyser l'ensemble de la table et à acquérir des verrous partagés qui la couvrent dans sa totalité. Par conséquent, Spanner doit lire plus de données que nécessaire.
les transactions simultanées ne peuvent pas modifier les données en parallèle:
-- 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";
Pour optimiser l'opération de mise à jour, incluez la colonne SingerId
dans la clause WHERE
. La colonne SingerId
est la seule colonne de clé primaire pour la table Singers
:
-- ANTI-PATTERN: SENDING AN UPDATE THAT MUST SCAN THE ENTIRE TABLE
UPDATE Singers SET FirstName = "Marcel"
WHERE FirstName = "Marc" AND LastName = "Richards"
S'il n'y a pas d'index sur FirstName
ou LastName
, vous devez :
analyser l'ensemble de la table
pour trouver les chanteurs cibles. Si vous ne souhaitez pas ajouter
pour que la mise à jour soit plus efficace, puis incluez la colonne SingerId
dans la clause WHERE
.
La colonne SingerId
est la seule colonne de clé primaire pour la table Singers
. Pour le trouver, exécutez SELECT
dans une transaction en lecture seule distincte avant la transaction de mise à jour :
SELECT SingerId
FROM Singers
WHERE FirstName = "Marc" AND LastName = "Richards"
-- Recommended: Including a seekable filter in the where clause
UPDATE Singers SET FirstName = "Marcel"
WHERE SingerId = 1;
Simultanéité
Spanner exécute de manière séquentielle toutes les instructions SQL (SELECT
,
INSERT
, UPDATE
et DELETE
) au sein d'une transaction. Elles ne sont pas exécutées simultanément. La seule exception est que Spanner peut exécuter
SELECT
simultanément, car il s'agit d'opérations en lecture seule.
Limites de transaction
Une transaction qui comprend des instructions LMD est soumise aux mêmes limites que toute autre transaction. Si vous devez effectuer des modifications à grande échelle, envisagez d'utiliser le LMD partitionné.
Si les instructions LMD d'une transaction entraînent plus de 80 000 mutations, l'instruction LMD qui pousse la transaction au-dessus de la limite renvoie une erreur
BadUsage
, avec un message indiquant que le nombre de mutations est trop élevé.Si les instructions LMD d'une transaction entraînent une transaction supérieure à 100 Mo, l'instruction LMD qui pousse la transaction au-dessus de la limite renvoie une erreur
BadUsage
, avec un message indiquant que la transaction dépasse la limite de taille.
Les mutations effectuées à l'aide du LMD ne sont pas renvoyées au client. Elles sont fusionnées dans la requête commit quand elle est validée et sont prises en compte dans les tailles maximales. Même si la taille de la requête commit que vous envoyez est petite, la transaction peut dépasser la limite de taille autorisée.
Instructions d'exécution dans la console Google Cloud
Suivez la procédure ci-dessous pour exécuter une instruction DML dans la console Google Cloud.
Accédez à la page Instances de Spanner.
Sélectionnez votre projet dans la liste déroulante de la barre d’outils.
Cliquez sur le nom de l'instance contenant votre base de données pour accéder à la page Détails de l'instance.
Dans l'onglet Vue d'ensemble, cliquez sur le nom de votre base de données. La page Détails de la base de données s'affiche.
Cliquez sur Spanner Studio.
Entrez une instruction LMD. Par exemple, l'instruction suivante ajoute une ligne à la table
Singers
.INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')
Cliquez sur Exécuter la requête. Le résultat s'affiche dans la console Google Cloud.
Exécuter des instructions avec la Google Cloud CLI
Pour exécuter des instructions LMD, utilisez la commande gcloud spanner databases execute-sql
. L'exemple suivant ajoute une ligne à la table Singers
.
gcloud spanner databases execute-sql example-db --instance=test-instance \ --sql="INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')"
Modifier des données à l'aide de la bibliothèque cliente
Pour exécuter des instructions LMD à l'aide de la bibliothèque cliente :
- Créez une transaction en lecture/écriture.
- Appelez la méthode de la bibliothèque cliente pour une exécution LMD, et transmettez l'instruction LMD.
- Utilisez la valeur affichée par la méthode d'exécution de l'instruction LMD pour obtenir le nombre de lignes insérées, mises à jour ou supprimées.
L'exemple de code suivant insère une ligne dans la table Singers
.
C++
Vous utilisez la fonction ExecuteDml()
pour exécuter une instruction LMD.
C#
L'exécution d'une instruction LMD s'effectue via la méthode ExecuteNonQueryAsync()
.
Go
L'exécution d'une instruction LMD s'effectue via la méthode Update()
.
Java
L'exécution d'une instruction LMD s'effectue via la méthode executeUpdate()
.
Node.js
L'exécution d'une instruction LMD s'effectue via la méthode runUpdate()
.
PHP
L'exécution d'une instruction LMD s'effectue via la méthode executeUpdate()
.
Python
L'exécution d'une instruction LMD s'effectue via la méthode execute_update()
.
Ruby
L'exécution d'une instruction LMD s'effectue via la méthode execute_update()
.
L'exemple de code suivant met à jour la colonne MarketingBudget
de la table Albums
en fonction d'une clause WHERE
.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
L'exemple de code suivant supprime toutes les lignes de la table Singers
pour lesquelles la colonne FirstName
contient Alice
.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
L'exemple suivant, réservé aux bases de données GoogleSQL, utilise un objet STRUCT
avec des paramètres de liaison pour mettre à jour l'élément LastName
dans les lignes filtrées par FirstName
et LastName
.
GoogleSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modifier des données à l'aide des instructions LMD renvoyées
La clause THEN RETURN
(bases de données en dialecte GoogleSQL) ou la clause RETURNING
(bases de données en dialecte PostgreSQL) est destinée aux scénarios où vous souhaitez extraire des données à partir de lignes modifiées. Ce
est particulièrement utile lorsque vous souhaitez afficher des valeurs non spécifiées dans le LMD
de valeurs par défaut ou de colonnes générées.
Pour exécuter des instructions LMD renvoyées à l'aide de la bibliothèque cliente, procédez comme suit:
- Créez une transaction en lecture/écriture.
- Appelez la méthode de la bibliothèque cliente pour l'exécution de la requête et transmettez l'instruction LMD renvoyée pour obtenir les résultats.
L'exemple de code suivant insère une ligne dans la table Singers
.
renvoie la colonne générée FullName des enregistrements insérés.
GoogleSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
PostgreSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
L'exemple de code suivant met à jour la colonne MarketingBudget
de Albums
.
table basée sur une clause WHERE
, et renvoie le MarketingBudget
modifié
des enregistrements mis à jour.
GoogleSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
PostgreSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
L'exemple de code suivant supprime toutes les lignes de la table Singers
où la clause
La colonne FirstName
est Alice
, et elle renvoie SingerId
et FullName
.
des enregistrements supprimés.
GoogleSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
PostgreSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Lire des données écrites dans la même transaction
Les modifications que vous effectuez à l'aide d'instructions LMD sont visibles pour les instructions suivantes dans la même transaction. Cette méthode est différente des mutations, avec lesquelles les modifications ne sont visibles que lors du commit de la transaction.
Spanner vérifie les contraintes après chaque instruction LMD. Ce comportement est différent de celui applicable aux mutations : Spanner place ces mutations en tampon dans le client jusqu'au commit, puis vérifie les contraintes au moment du commit. En évaluant les contraintes après chaque instruction, Spanner peut garantir que les données affichées par une instruction LMD sont cohérentes avec le schéma.
L'exemple ci-dessous permet de mettre à jour une ligne de la table Singers
, puis d'exécuter une instruction SELECT
pour afficher les nouvelles valeurs.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Obtenir le plan de requête
Vous pouvez récupérer un plan de requête à l'aide de la console Google Cloud, des bibliothèques clientes et de l'outil de ligne de commande gcloud
.
Utiliser le LMD partitionné
Le LMD partitionné est conçu pour les mises à jour et les suppressions groupées, notamment les nettoyages et les remplissages périodiques.
Exécuter des instructions avec la Google Cloud CLI
Pour exécuter une instruction en LMD partitionné, utilisez la commande gcloud spanner databases execute-sql
avec l'option --enable-partitioned-dml
. L'exemple suivant met à jour les lignes de la table Albums
.
gcloud spanner databases execute-sql example-db \ --instance=test-instance --enable-partitioned-dml \ --sql='UPDATE Albums SET MarketingBudget = 0 WHERE MarketingBudget IS NULL'
Modifier des données à l'aide de la bibliothèque cliente
L'exemple de code suivant met à jour la colonne MarketingBudget
de la table Albums
.
C++
Vous utilisez la fonction ExecutePartitionedDml()
pour exécuter une instruction DML partitionnée.
C#
Utilisez la méthode ExecutePartitionedUpdateAsync()
pour exécuter une instruction en mode LMD partitionné.
Go
Utilisez la méthode PartitionedUpdate()
pour exécuter une instruction en mode LMD partitionné.
Java
Utilisez la méthode executePartitionedUpdate()
pour exécuter une instruction en mode LMD partitionné.
Node.js
Utilisez la méthode runPartitionedUpdate()
pour exécuter une instruction en mode LMD partitionné.
PHP
Utilisez la méthode executePartitionedUpdate()
pour exécuter une instruction en mode LMD partitionné.
Python
Utilisez la méthode execute_partitioned_dml()
pour exécuter une instruction en mode LMD partitionné.
Ruby
Utilisez la méthode execute_partitioned_update()
pour exécuter une instruction en mode LMD partitionné.
L'exemple de code suivant supprime les lignes de la table Singers
, en fonction de la colonne SingerId
.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Utiliser le LMD par lots
Si vous devez éviter le temps de latence supplémentaire occasionné par l'envoi de plusieurs requêtes en série, utilisez le LMD par lots pour envoyer plusieurs instructions INSERT
, UPDATE
ou DELETE
au sein d'une même transaction :
C++
Utilisez la fonction ExecuteBatchDml()
pour exécuter une liste d'instructions LMD.
C#
Utilisez la méthode connection.CreateBatchDmlCommand()
pour créer votre commande par lot, puis la méthode Add
pour ajouter des instructions LMD. Enfin, exécutez l'ensemble à l'aide de la méthode ExecuteNonQueryAsync()
.
Go
Utilisez la méthode BatchUpdate()
pour exécuter un tableau d'objets constitué d'instructions LMD Statement
.
Java
Utilisez la méthode transaction.batchUpdate()
pour exécuter un objet ArrayList
constitué d'instructions LMD Statement
.
Node.js
Utilisez transaction.batchUpdate()
pour exécuter une liste d'instructions LMD.
PHP
Utilisez executeUpdateBatch()
pour créer une liste d'instructions LMD, puis utilisez commit()
pour exécuter les instructions.
Python
Utilisez transaction.batch_update()
pour exécuter plusieurs chaînes correspondant à des instructions LMD.
Ruby
Utilisez transaction.batch_update
pour exécuter plusieurs chaînes correspondant à des instructions LMD.