Aggiornamento di 700 milioni di righe sullo stesso valore


12

Ho un data warehouse (oracolo) in cui devo impostare una colonna sullo stesso valore per tutti i 700 milioni di righe.

Non ho accesso come amministratore o accesso a un amministratore, quindi questo deve essere realizzato con sql di base e nessuna tabella temporanea crea.

Ulteriori complicazioni sono se provo a fare un semplice aggiornamento in cui 1 = 1, si esaurisce lo spazio di ripetizione.

Il modo in cui l'ho eseguito in questo momento è il looping come questo:

loop
  update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000;
  commit;
end loop

ma so che questo è probabilmente ingenuo e deve esserci una soluzione più rapida ed elegante.


La tabella è partizionata?
Jack dice di provare topanswers.xyz il

Io non ci credo. Esistono un paio di indici, ma nessuno di questi riguarda la colonna che sto aggiornando.
pubblicato il

Risposte:


4

Se hai lo spazio, puoi CTAS usando il comando Annulla / Ripeti minimo . Se hai qualche indice, farlo in qualsiasi altro modo sarà molto lento e genererà una registrazione come un matto.

Nel caso in cui si disponga di un singolo IOT senza indici secondari o di un singolo cluster di tabella, è possibile scorrere l'aggiornamento della chiave primaria / cluster in blocchi senza dover ripetere la scansione dell'intera tabella per trovare i campi che non sono stati ancora aggiornati.

--modificare

Non riesco a creare una tabella secondaria ... Ci sono un paio di indici, ma nessuno di questi riguarda la colonna che sto aggiornando.

Quindi suggerisco di dividere la tabella in blocchi per l'elaborazione usando qualcosa su cui stai indicizzando (anche se è una singola colonna, puoi dividerla in intervalli di valori) Questo farà un FTS una volta anziché una volta per ogni blocco come nel tuo codice. Dovrai convivere con un sacco di ripetizioni e cancellerai anche il tuo spazio di annullamento (quindi nessun flashback in seguito)

--edit2

se puoi aggiungere / rinominare / rilasciare colonne, puoi farlo in modo molto efficiente , ma solo su 11g


1
Se il tuo DBA te lo consente NOLOGGING, ciò invaliderà hotstandbys.
Caio,

In effetti, e un backup in seguito sarebbe anche una buona idea - ma questo è un magazzino ed nologgingè uno strumento per i magazzini
Jack dice che prova a topanswers.xyz il

Non sono in grado di creare una tabella secondaria, sicuramente non grande come la prima, anche se solo temporanea.
pubblicato il

Il tuo link 11g sembrava promettente, ma vedo commenti là fuori che per un tavolo da 60m era ancora terribilmente lento a causa della necessità di impostare il valore per ogni riga. Poiché la mia tabella è 10 volte quella dimensione, quel metodo potrebbe non essere un miglioramento.
owook

@owook no, su 11g questa operazione è rapida e non imposta il valore per ogni riga "per alcuni tipi di tabelle (ad esempio tabelle senza colonne LOB)" . Provalo su un sottoinsieme del tuo tavolo ( create table foo as select * from bar where rownum<100000)
Jack dice che prova topanswers.xyz il

1

Se sei su 11g, rilascia la colonna e aggiungila nuovamente come una colonna NOT NULL con un valore predefinito. Ciò è controintuitivo, ma Oracle memorizzerà il valore predefinito nella definizione della tabella, sostituendo il valore predefinito in fase di esecuzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.