Questa pagina descrive come inserire, aggiornare ed eliminare i dati di Spanner utilizzando le istruzioni DML (Data Manipulation Language). Puoi eseguire istruzioni DML
utilizzando le librerie client, la
console Google Cloud e lo strumento a riga di comando gcloud
. Puoi eseguire istruzioni DML partizionate utilizzando le librerie client e lo strumento a riga di comando gcloud
.
Per il riferimento completo alla sintassi DML, consulta Sintassi del linguaggio di manipolazione dei dati per i database in dialetto GoogleSQL o Lingua di manipolazione dei dati PostgreSQL per i database in dialetto PostgreSQL
Utilizzare DML
Il linguaggio DML supporta gli statement INSERT
, UPDATE
e DELETE
nella console Google Cloud, in Google Cloud CLI e nelle librerie client.
Chiusura della serratura
Esegui istruzioni DML all'interno di transazioni di lettura/scrittura. Quando Spanner legge i dati, acquisisce i blocchi di lettura condivisi su porzioni limitate degli intervalli di righe letti. Nello specifico, acquisisce questi blocchi solo sulle colonne a cui accedi. Le chiusure possono includere dati che nonsoddisfano la condizione di filtro della clausola WHERE
.
Quando Spanner modifica i dati utilizzando le istruzioni DML, acquisisce i blocchi esclusivi sui dati specifici che stai modificando. Inoltre, acquisisce i blocchi condivisi nello stesso modo in cui accade quando leggi i dati. Se la richiesta include intervalli di righe di grandi dimensioni o un'intera tabella, i blocchi condivisi potrebbero impedire ad altre transazioni di progredire in parallelo.
Per modificare i dati nel modo più efficiente possibile, utilizza una clausola WHERE
che consenta a Spanner di leggere solo le righe necessarie. Puoi raggiungere questo obiettivo con un filtro sulla chiave primaria o sulla chiave di un indice secondario. La clausola WHERE
limita l'ambito dei blocchi condivisi e consente a Spanner di elaborare l'aggiornamento in modo più efficiente.
Ad esempio, supponiamo che uno dei musicisti nella tabella Singers
cambi il suo nome e tu debba aggiornare il nome nel database. Potresti eseguire la seguente istruzione DML, ma questa forza Spanner a eseguire la scansione dell'intera tabella e acquisisce i blocchi condivisi che coprono l'intera tabella. Di conseguenza, Spanner deve leggere più dati del necessario e le transazioni concorrenti non possono modificare i dati in parallelo:
-- 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";
Per rendere l'aggiornamento più efficiente, includi la colonna SingerId
nella clausola WHERE
. La colonna SingerId
è l'unica colonna della chiave primaria per la tabella Singers
:
-- ANTI-PATTERN: SENDING AN UPDATE THAT MUST SCAN THE ENTIRE TABLE
UPDATE Singers SET FirstName = "Marcel"
WHERE FirstName = "Marc" AND LastName = "Richards"
Se non è presente un indice su FirstName
o LastName
, devi eseguire la scansione dell'intera tabella per trovare i cantanti target. Se non vuoi aggiungere un indice secondario per rendere più efficiente l'aggiornamento, includi la colonna SingerId
nella clausola WHERE
.
La colonna SingerId
è l'unica colonna di chiave primaria per la tabella
Singers
. Per trovarlo, esegui SELECT
in una transazione di sola lettura distinta prima della transazione di aggiornamento:
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;
Contemporaneità
Spanner esegue in sequenza tutte le istruzioni SQL (SELECT
,
INSERT
, UPDATE
e DELETE
) all'interno di una transazione. Non vengono eseguiti
contemporaneamente. L'unica eccezione è che Spanner potrebbe eseguire più istruzioni
SELECT
contemporaneamente, perché sono operazioni di sola lettura.
Limiti per le transazioni
Una transazione che include istruzioni DML ha gli stessi limiti di qualsiasi altra transazione. Se hai modifiche su larga scala, valuta la possibilità di utilizzare DML partizionato.
Se le istruzioni DML in una transazione generano più di 80.000 mutazioni, l'istruzione DML che fa superare il limite alla transazione restituisce un errore
BadUsage
con un messaggio relativo a un numero eccessivo di mutazioni.Se le istruzioni DML in una transazione generano una transazione più grande di 100 MB, l'istruzione DML che spinge la transazione oltre il limite restituisce un errore
BadUsage
con un messaggio relativo al superamento del limite di dimensioni della transazione.
Le mutazioni eseguite utilizzando la DML non vengono restituite al client. Vengono uniti alla richiesta di commit al momento del commit e concorrono al raggiungimento dei limiti di dimensione massimi. Anche se le dimensioni della richiesta di commit inviata sono ridotte, la transazione potrebbe comunque superare il limite di dimensioni consentito.
Esegui istruzioni nella console Google Cloud
Per eseguire un'istruzione DML nella console Google Cloud:
Vai alla pagina Istanze di Spanner.
Seleziona il progetto nell'elenco a discesa della barra degli strumenti.
Fai clic sul nome dell'istanza contenente il database per andare alla pagina Dettagli istanza.
Nella scheda Panoramica, fai clic sul nome del database. Viene visualizzata la pagina Dettagli database.
Fai clic su Spanner Studio.
Inserisci un'istruzione DML. Ad esempio, l'istruzione seguente aggiunge una nuova riga alla tabella
Singers
.INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')
Fai clic su Esegui query. La console Google Cloud mostra il risultato.
Esegui istruzioni con Google Cloud CLI
Per eseguire istruzioni DML, utilizza il comando gcloud spanner databases execute-sql
. L'esempio seguente aggiunge una nuova riga alla tabella Singers
.
gcloud spanner databases execute-sql example-db --instance=test-instance \ --sql="INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')"
Modificare i dati utilizzando la libreria client
Per eseguire istruzioni DML utilizzando la libreria client:
- Crea una transazione di lettura/scrittura.
- Chiama il metodo della libreria client per l'esecuzione della DML e passa l'istruzione DML.
- Utilizza il valore restituito del metodo di esecuzione DML per ottenere il numero di righe inserite, aggiornate o eliminate.
Il seguente esempio di codice inserisce una nuova riga nella tabella Singers
.
Utilizza la funzione ExecuteDml()
per eseguire un'istruzione DML.
Utilizza il metodo ExecuteNonQueryAsync()
per eseguire un'istruzione DML.
Utilizza il metodo Update()
per eseguire un'istruzione DML.
Utilizza il metodo executeUpdate()
per eseguire un'istruzione DML.
Utilizza il metodo runUpdate()
per eseguire un'istruzione DML.
Utilizza il metodo executeUpdate()
per eseguire un'istruzione DML.
Utilizza il metodo execute_update()
per eseguire un'istruzione DML.
Utilizza il metodo execute_update()
per eseguire un'istruzione DML.
L'esempio di codice seguente aggiorna la colonna MarketingBudget
della tabella Albums
in base a una clausola WHERE
.
Il seguente esempio di codice elimina tutte le righe della tabella Singers
in cui la colonna FirstName
è Alice
.
Il seguente esempio, solo per i database in dialetto GoogleSQL, utilizza un
STRUCT
con parametri vincolati
per aggiornare il LastName
nelle righe filtrate per FirstName
e LastName
.
Modifica i dati con le istruzioni DML che restituiscono dati
La clausola THEN RETURN
(database in dialetto GoogleSQL)
o la clausola RETURNING
(database in dialetto PostgreSQL)
è progettata per gli scenari in cui vuoi recuperare i dati dalle righe modificate. Questa opzione è particolarmente utile quando vuoi visualizzare valori non specificati nelle istruzioni DML, nei valori predefiniti o nelle colonne generate.
Per eseguire istruzioni DML che restituiscono dati utilizzando la libreria client:
- Crea una transazione di lettura/scrittura.
- Chiama il metodo della libreria client per l'esecuzione della query e passa l'istruzione DML restituita per ottenere i risultati.
Il seguente esempio di codice inserisce una nuova riga nella tabella Singers
e
restituisce la colonna FullName generata dei record inseriti.
L'esempio di codice seguente aggiorna la colonna MarketingBudget
della tabella Albums
in base a una clausola WHERE
e restituisce la colonna MarketingBudget
modificata dei record aggiornati.
Il seguente esempio di codice elimina tutte le righe della tabella Singers
in cui la colonna FirstName
è Alice
e restituisce le colonne SingerId
e FullName
dei record eliminati.
Leggere i dati scritti nella stessa transazione
Le modifiche apportate utilizzando le istruzioni DML sono visibili alle istruzioni successive nella stessa transazione. Questo è diverso dall'utilizzo delle mutazioni, in cui le modifiche non sono visibili fino all'commit della transazione.
Spanner controlla le limitazioni dopo ogni istruzione DML. Questo è diverso dall'utilizzo delle mutazioni, in cui Spanner mette in buffer le mutazioni nel client fino al commit e controlla i vincoli al momento del commit. La valutazione dei vincoli dopo ogni istruzione consente a Spanner di garantire che i dati restituiti da un'istruzione DML siano coerenti con lo schema.
L'esempio seguente aggiorna una riga nella tabella Singers
, quindi esegue un'istruzione SELECT
per stampare i nuovi valori.
Ottieni il piano di query
Puoi recuperare un piano di query
utilizzando la console Google Cloud, le librerie client e lo strumento a riga di comando gcloud
.
Utilizza DML partizionato
Il DML partizionato è progettato per aggiornamenti e eliminazioni collettivi, in particolare per la pulizia e il backfill periodici.
Esegui istruzioni con Google Cloud CLI
Per eseguire un'istruzione DML partizionata, utilizza il comando
gcloud spanner databases execute-sql
con l'opzione
--enable-partitioned-dml
. L'esempio seguente aggiorna le righe della tabellaAlbums
.
gcloud spanner databases execute-sql example-db \ --instance=test-instance --enable-partitioned-dml \ --sql='UPDATE Albums SET MarketingBudget = 0 WHERE MarketingBudget IS NULL'
Modificare i dati utilizzando la libreria client
Il seguente esempio di codice aggiorna la colonna MarketingBudget
della tabella Albums
.
Utilizza la funzione ExecutePartitionedDml()
per eseguire un'istruzione DML partizionata.
Utilizza il metodo ExecutePartitionedUpdateAsync()
per eseguire un'istruzione DML partizionata.
Utilizza il metodo PartitionedUpdate()
per eseguire un'istruzione DML partizionata.
Utilizza il metodo executePartitionedUpdate()
per eseguire un'istruzione DML partizionata.
Utilizza il metodo runPartitionedUpdate()
per eseguire un'istruzione DML partizionata.
Utilizza il metodo executePartitionedUpdate()
per eseguire un'istruzione DML partizionata.
Utilizza il metodo execute_partitioned_dml()
per eseguire un'istruzione DML partizionata.
Utilizza il metodo execute_partitioned_update()
per eseguire un'istruzione DML partizionata.
L'esempio di codice seguente elimina le righe dalla tabella Singers
in base alla colonna SingerId
.
Utilizzare DML batch
Se devi evitare la latenza aggiuntiva dovuta a più richieste seriali,
utilizza la DML batch per inviare più istruzioni INSERT
, UPDATE
o DELETE
in una
singola transazione:
Utilizza la funzione ExecuteBatchDml()
per eseguire un elenco di istruzioni DML.
Utilizza il metodo connection.CreateBatchDmlCommand()
per creare il comando batch, il metodo Add
per aggiungere istruzioni DML ed esegui le istruzioni con il metodo ExecuteNonQueryAsync()
.
Utilizza il metodo BatchUpdate()
per eseguire un array di oggetti Statement
DML.
Utilizza il metodo transaction.batchUpdate()
per eseguire un ArrayList
di più oggetti Statement
DML.
Utilizza transaction.batchUpdate()
per eseguire un elenco di istruzioni DML.
Utilizza executeUpdateBatch()
per creare un elenco di istruzioni DML, quindi utilizza
commit()
per eseguirle.
Utilizza transaction.batch_update()
per eseguire più stringhe di istruzioni DML.
Utilizza transaction.batch_update
per eseguire più stringhe di istruzioni DML.