Bonnes pratiques relatives au langage de manipulation de données

Cette page décrit les bonnes pratiques d'utilisation du langage de manipulation de données (LMD) et du LMD partitionné.

Utiliser une clause WHERE pour réduire le nombre de lignes verrouillées

Les instructions LMD sont exécutées dans les transactions de lecture-écriture. Lorsque Cloud Spanner lit des données, il acquiert des verrous en lecture partagés sur les parties limitées des plages de lignes que vous consultez. Plus précisément, il n'acquiert ces verrous que sur les colonnes auxquelles vous accédez. Les verrous peuvent inclure des données qui ne correspondent pas à la condition de filtre de la clause WHERE.

Lorsque Cloud 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 se terminer en parallèle.

Pour modifier les données aussi efficacement que possible, utilisez une clause WHERE permettant à Cloud Spanner de 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 à Cloud 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 Cloud Spanner à analyser l'ensemble de la table et à acquérir des verrous partagés qui la couvrent dans sa totalité. Par conséquent, Cloud Spanner doit lire davantage de données que nécessaire, et 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 :

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

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

Ne pas combiner instructions LMD et mutations dans la même transaction

Cloud Spanner met en tampon les insertions, les modifications et les suppressions effectuées à l'aide d'instructions LMD côté serveur. Les résultats sont visibles pour les instructions SQL et LMD ultérieures dans la même transaction. Contrairement à ce qui se produit lors de l'utilisation de l'API Mutation, Cloud Spanner met en tampon les mutations côté client et envoie les mutations côté serveur dans le cadre de l'opération de commit. En conséquence, les mutations dans la requête de commit ne sont pas visibles pour les instructions SQL ou LMD dans la même transaction.

Vous souhaiterez peut-être combiner des instructions LMD et des mutations dans la même transaction, car certaines opérations ne sont disponibles que dans l'API Mutation. C'est, par exemple, le cas de insert_or_update. Si une transaction contient à la fois des instructions LMD et des mutations dans la requête de commit, Cloud Spanner exécute les instructions LMD avant les mutations. Pour éviter de devoir prendre en compte l'ordre d'exécution dans le code de votre bibliothèque cliente, vous devez utiliser soit les instructions LMD, soit les mutations d'une même transaction, mais pas les deux. Si vous utilisez les deux, il est recommandé de ne mettre en tampon les écritures qu'à la toute fin de la transaction.

Utiliser la fonction PENDING_COMMIT_TIMESTAMP pour écrire des horodatages de commit

Pour écrire l'horodatage de commit dans une instruction LMD, utilisez la fonction PENDING_COMMIT_TIMESTAMP. Cloud Spanner sélectionne l'horodatage de commit lorsque la transaction est enregistrée.

LMD partitionné, et fonctions de date et d'horodatage

Le LMD partitionné utilise une ou plusieurs transactions pouvant être exécutées et enregistrées à des moments différents. Si vous utilisez les fonctions de date ou d'horodatage, les lignes modifiées peuvent contenir des valeurs différentes.

Utiliser le traitement LMD par lots pour envoyer plusieurs LMD en une seule requête.

Utiliser le traitement LMD par lots pour envoyer plusieurs LMD en une seule requête. De cette manière, un seul aller-retour client-serveur est nécessaire, ce qui réduit la latence.