Il Data Manipulation Language partizionato (DML partizionato) è progettato per i seguenti tipi di aggiornamenti ed eliminazioni collettivi:
- Pulizia periodica e garbage collection. Alcuni esempi sono l'eliminazione di righe vecchie o l'impostazione di colonne su
NULL
. - Eseguire il backfill delle nuove colonne con i valori predefiniti. Un esempio è l'utilizzo di un'istruzione
UPDATE
per impostare il valore di una nuova colonna suFalse
se al momento èNULL
.
La DML partizionata non è adatta per l'elaborazione di transazioni su piccola scala. Se vuoi eseguire un'istruzione su alcune righe, utilizza le DML transazionali con chiavi principali identificabili. Per ulteriori informazioni, consulta Utilizzare DML.
Se devi eseguire il commit di un numero elevato di scritture cieche, ma non hai bisogno di una transazione atomica, puoi modificare collettivamente le tabelle Spanner utilizzando la scrittura batch. Per ulteriori informazioni, consulta Modificare i dati utilizzando le scritture batch.
Puoi ottenere informazioni sulle query DML partizionate attive e sul loro avanzamento dalle tabelle statistiche nel tuo database Spanner. Per ulteriori informazioni, consulta Statistiche sulle DML partizionate attive.
DML e DML partizionato
Spanner supporta due modalità di esecuzione per le istruzioni DML:
DML, che è adatto per l'elaborazione delle transazioni. Per ulteriori informazioni, consulta Utilizzare DML.
DML partizionata, che consente operazioni su larga scala a livello di database con un impatto minimo sull'elaborazione delle transazioni concorrenti mediante il partizionamento dello spazio delle chiavi ed esecuzione dell'istruzione sulle partizioni in transazioni separate di ambito più ridotto. Per ulteriori informazioni, consulta la sezione Utilizzare la DML partizionata.
La seguente tabella evidenzia alcune delle differenze tra le due modalità di esecuzione.
DML | DML partizionato |
---|---|
Le righe che non corrispondono alla clausola WHERE potrebbero essere bloccate. |
Vengono bloccate solo le righe che corrispondono alla clausola WHERE . |
Si applicano limiti di dimensione delle transazioni. | Spanner gestisce i limiti di transazioni e i limiti di concorrenza per transazione. |
Le istruzioni non devono essere idempotenti. | Un'istruzione DML deve essere idempotente per garantire risultati coerenti. |
Una transazione può includere più istruzioni DML e SQL. | Una transazione partizionata può includere una sola istruzione DML. |
Non ci sono limitazioni alla complessità delle istruzioni. | Le istruzioni devono essere completamente partizionabili. |
Credi transazioni di lettura/scrittura nel codice client. | Spanner crea le transazioni. |
Partizionabile e idempotente
Quando viene eseguito un'istruzione DML partizionata, le righe di una partizione non hanno accesso alle righe di altre partizioni e non puoi scegliere in che modo Spanner crea le partizioni. La partizione garantisce la scalabilità, ma significa anche che
le istruzioni DML partizionate devono essere completamente partizionate. In altre parole, l'istruzione DML partizionata deve essere esprimibile come unione di un insieme di istruzioni, in cui ogni istruzione accede a una singola riga della tabella e non accede ad altre tabelle. Ad esempio, un'istruzione DML che accede a più tabelle o esegue un join autonomo non è partizionabile. Se l'istruzione DML non è partizionabile, Spanner restituisce l'errore BadUsage
.
Queste istruzioni DML sono completamente partizionabili, perché ogni istruzione può essere applicata a una singola riga della tabella:
UPDATE Singers SET LastName = NULL WHERE LastName = '';
DELETE FROM Albums WHERE MarketingBudget > 10000;
Questa istruzione DML non è completamente partizionabile perché accede a più tabelle:
# Not fully partitionable
DELETE FROM Singers WHERE
SingerId NOT IN (SELECT SingerId FROM Concerts);
Spanner potrebbe eseguire un'istruzione DML partizionata più volte su alcune partizioni a causa di ripetuti tentativi a livello di rete. Di conseguenza, un'istruzione potrebbe essere eseguita più di una volta in una riga. L'istruzione deve quindi essere idempotente per produrre risultati coerenti. Un'istruzione è idempotente se la sua esecuzione più volte su una singola riga porta allo stesso risultato.
Questa istruzione DML è idempotente:
UPDATE Singers SET MarketingBudget = 1000 WHERE true;
Questa istruzione DML non è idempotente:
UPDATE Singers SET MarketingBudget = 1.5 * MarketingBudget WHERE true;
Blocco righe
Spanner acquisisce un blocco solo se una riga è candidata per l'aggiornamento o l'eliminazione. Questo comportamento è diverso dall'esecuzione di DML, che potrebbe bloccare in lettura le righe che non corrispondono alla clausola WHERE
.
Esecuzione e transazioni
Il fatto che un'istruzione DML sia partizionata o meno dipende dal metodo della libreria del client scelto per l'esecuzione. Ogni libreria client fornisce metodi distinti per l'esecuzione DML e l'esecuzione DML partizionata.
Puoi eseguire una sola istruzione DML partizionata in una chiamata al metodo della libreria client.
Spanner non applica gli enunciati DML partizionati in modo atomico all'intera tabella. Tuttavia, Spanner applica le istruzioni DML partitioned in modo atomico a ogni partizione.
La DML partizionata non supporta il commit o il rollback. Spanner esegue e applica immediatamente l'istruzione DML.
- Se annulli l'operazione, Spanner annulla le partizioni in esecuzione e non avvia le partizioni rimanenti. Spanner non esegue il rollback delle partizioni già eseguite.
- Se l'esecuzione dell'istruzione causa un errore, l'esecuzione si interrompe in tutte le partizioni e Spanner restituisce l'errore per l'intera operazione. Alcuni esempi di errori sono violazioni dei vincoli del tipo di dato, violazioni di
UNIQUE INDEX
e violazioni diON DELETE NO ACTION
. A seconda del momento in cui l'esecuzione non è riuscita, l'istruzione potrebbe essere stata eseguita correttamente su alcune partizioni e non essere mai stata eseguita su altre partizioni.
Se l'istruzione DML partizionata ha esito positivo, Spanner ha eseguito l'istruzione almeno una volta per ogni partizione dell'intervallo di chiavi.
Conteggio delle righe modificate
Un'istruzione DML partizionata restituisce un limite inferiore per il numero di righe modificate. Potrebbe non essere un conteggio esatto del numero di righe modificate, perché non è garantito che Spanner conteggia tutte le righe modificate.
Limiti per le transazioni
Spanner crea le partizioni e le transazioni di cui ha bisogno per eseguire un'istruzione DML partizionata. Si applicano limiti di transazioni o limiti di concorrenza per transazione, ma Spanner tenta di mantenere le transazioni entro i limiti.
Spanner consente un massimo di 20.000 istruzioni DML partizionate in parallelo per database.
Funzionalità non supportate
Spanner non supporta alcune funzionalità per la DML partizionata:
INSERT
non è supportato.- Console Google Cloud: non puoi eseguire istruzioni DML partizionate nella console Google Cloud.
- Piani di query e profilazione: l'interfaccia a riga di comando Google Cloud e le librerie client non supportano i piani di query e la profilazione.
- Subquery che leggono da un'altra tabella o da una riga diversa della stessa tabella.
Per scenari complessi, come lo spostamento di una tabella o trasformazioni che richiedono join tra tabelle, ti consigliamo di utilizzare il connettore Dataflow.
Esempi
Il seguente esempio di codice aggiorna la colonna MarketingBudget
della tabella Albums
.
C++
Utilizza la funzione ExecutePartitionedDml()
per eseguire un'istruzione DML partizionata.
C#
Utilizza il metodo ExecutePartitionedUpdateAsync()
per eseguire un'istruzione DML partizionata.
Vai
Utilizza il metodo PartitionedUpdate()
per eseguire un'istruzione DML partizionata.
Java
Utilizza il metodo executePartitionedUpdate()
per eseguire un'istruzione DML partizionata.
Node.js
Utilizza il metodo runPartitionedUpdate()
per eseguire un'istruzione DML partizionata.
PHP
Utilizza il metodo executePartitionedUpdate()
per eseguire un'istruzione DML partizionata.
Python
Utilizza il metodo execute_partitioned_dml()
per eseguire un'istruzione DML partizionata.
Ruby
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
.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Passaggi successivi
Scopri come modificare i dati utilizzando la DML.
Scopri le best practice per il Data Manipulation Language (DML).
Per scoprire le differenze tra DML e mutazioni, consulta Confrontare DML e mutazioni
Valuta la possibilità di utilizzare il connettore Dataflow per altri scenari di trasformazione dei dati.