Trasforma i dati con DML (Data Manipulation Language)

Il Data Manipulation Language (DML) di BigQuery consente di aggiornare, inserire ed eliminare dati dalle tabelle BigQuery.

Puoi eseguire istruzioni DML proprio come faresti con un'istruzione SELECT, con le seguenti condizioni:

  • Devi usare GoogleSQL. Per attivare GoogleSQL, consulta Cambio di dialetti SQL.
  • Non puoi specificare una tabella di destinazione per la query.

Per un elenco di istruzioni DML di BigQuery ed esempi di come utilizzarle, consulta Istruzioni del linguaggio di manipolazione dei dati in GoogleSQL.

Limitazioni

  • Ogni istruzione DML avvia una transazione implicita, il che significa che le modifiche apportate dall'istruzione vengono confermate automaticamente alla fine di ogni istruzione DML riuscita.

  • Le righe scritte di recente utilizzando il metodo di flusso tabledata.insertall non possono essere modificate con il Data Manipulation Language (DML), ad esempio le istruzioni UPDATE, DELETE, MERGE o TRUNCATE. Le scritture recenti sono quelle che sono state eseguite negli ultimi 30 minuti. Tutte le altre righe della tabella rimangono modificabili utilizzando le istruzioni UPDATE, DELETE, MERGE o TRUNCATE. Possono essere necessari fino a 90 minuti prima che i dati trasferiti diventino disponibili per le operazioni di copia.

    In alternativa, le righe scritte di recente utilizzando l'API StorageWrite possono essere modificate utilizzando le istruzioni UPDATE, DELETE o MERGE (Anteprima). Per maggiori informazioni, vedi Utilizzare il Data Manipulation Language (DML) con flussi di dati recenti.

  • Le sottoquery correlate all'interno di un intervallo when_clause, search_condition, merge_update_clause o merge_insert_clause non sono supportate per le istruzioni MERGE.

  • Le query che contengono istruzioni DML non possono utilizzare una tabella con caratteri jolly come destinazione della query. Ad esempio, nella clausola FROM di una query UPDATE è possibile utilizzare una tabella con funzione carattere jolly, ma non una tabella con funzione carattere jolly come destinazione dell'operazione UPDATE.

Job simultanei

BigQuery gestisce la contemporaneità delle istruzioni DML che aggiungono, modificano o eliminano righe in una tabella.

INSERISCI contemporaneità DML

In un periodo di 24 ore, le prime 1500 istruzioni INSERT vengono eseguite immediatamente dopo l'invio. Una volta raggiunto questo limite, la contemporaneità delle istruzioni INSERT che scrivono in una tabella è limitata a 10. Ulteriori istruzioni INSERT vengono aggiunte a una coda PENDING. È possibile accodare fino a 100 istruzioni INSERT in una tabella in qualsiasi momento. Quando un'istruzione INSERT viene completata, la successiva istruzione INSERT viene rimossa dalla coda ed eseguita.

Se devi eseguire istruzioni INSERT DML con maggiore frequenza, valuta la possibilità di trasmettere i dati in modalità flusso alla tabella utilizzando l'API Storage Scrivi.

AGGIORNA, ELIMINA, UNISCI contemporaneità DML

Le istruzioni DML UPDATE, DELETE e MERGE sono chiamate istruzioni DML mutanti. Se invii una o più istruzioni DML mutanti in una tabella mentre altri job DML mutanti sono ancora in esecuzione (o in attesa), BigQuery ne esegue contemporaneamente fino a 2, dopodiché fino a 20 vengono messi in coda come PENDING. Al termine di un job in esecuzione, il job successivo in attesa viene rimosso dalla coda ed eseguito. Le istruzioni DML mutanti in coda condividono una coda per tabella di lunghezza massima di 20. Le istruzioni aggiuntive oltre la lunghezza massima della coda per ogni tabella non vanno a buon fine e viene visualizzato il messaggio di errore: Resources exceeded during query execution: Too many DML statements outstanding against table PROJECT_ID:TABLE, limit is 20.

I job DML con priorità interattiva che sono messi in coda per più di 6 ore non riescono e ricevono il seguente messaggio di errore:

DML statement has been queued for too long

Conflitti tra istruzione DML

La modifica delle istruzioni DML eseguite contemporaneamente su una tabella causa conflitti tra le istruzione DML quando le istruzioni tentano di mutare la stessa partizione. Le istruzioni hanno esito positivo purché non modifichino la stessa partizione. BigQuery prova a ripetere fino a tre volte le istruzioni non riuscite.

  • Un'istruzione DML INSERT che inserisce righe in una tabella non è in conflitto con altre istruzioni DML in esecuzione contemporaneamente.

  • Un'istruzione DML MERGE non è in conflitto con altre istruzioni DML in esecuzione contemporaneamente, purché l'istruzione inserisca solo righe e non elimini o aggiorna righe esistenti. Può includere istruzioni MERGE con clausole UPDATE o DELETE, purché queste clausole non vengano richiamate durante l'esecuzione della query.

Prezzi

Per informazioni sui prezzi di DML, consulta Prezzi di Data Manipulation Language nella pagina dei prezzi.

Best practice

Per prestazioni ottimali, Google consiglia i seguenti pattern:

  • Evita di inviare un numero elevato di singoli aggiornamenti o inserimenti di righe. Se possibile, raggruppa invece le operazioni DML. Per maggiori informazioni, consulta Istruzioni DML che aggiornano o inseriscono singole righe.

  • Se gli aggiornamenti o le eliminazioni si verificano in genere su dati meno recenti o entro un determinato intervallo di date, valuta la possibilità di partizionare le tabelle. Il partizionamento assicura che le modifiche siano limitate a partizioni specifiche all'interno della tabella.

  • Evita di partizionare le tabelle se la quantità di dati in ogni partizione è ridotta e ogni aggiornamento modifica una grande frazione delle partizioni.

  • Se aggiorni spesso le righe in cui una o più colonne rientrano in un intervallo ristretto di valori, valuta la possibilità di utilizzare le tabelle in cluster. Il clustering garantisce che le modifiche siano limitate a set specifici di blocchi, riducendo la quantità di dati che devono essere letti e scritti. Di seguito è riportato un esempio di istruzione UPDATE che filtra in base a un intervallo di valori di colonna:

    UPDATE mydataset.mytable
    SET string_col = 'some string'
    WHERE id BETWEEN 54 AND 75;
    

    Ecco un esempio simile in cui viene applicato un filtro in base a un piccolo elenco di valori di colonna:

    UPDATE mydataset.mytable
    SET string_col = 'some string'
    WHERE id IN (54, 57, 60);
    

    In questi casi, valuta la possibilità di eseguire il clustering sulla colonna id.

  • Se hai bisogno della funzionalità OLTP, puoi utilizzare le query federate di Cloud SQL, che consentono a BigQuery di eseguire query sui dati che risiedono in Cloud SQL.

Per le best practice per ottimizzare le prestazioni delle query, consulta Introduzione all'ottimizzazione delle prestazioni delle query.

Passaggi successivi