2010-10-07 6 views
7

Ho un tavolo davvero enorme, con ~ 200 milioni di righe. Non aveva affatto indice/pk. Le selezioni in questa tabella erano (ovviamente) lente. Ho deciso di creare un PK utilizzando 3 colonne. L'ho fatto in un ambiente di test che ha una versione ridotta di questo tavolo e ha funzionato come un fascino.La creazione di indice/pk in una tabella enorme richiede troppo tempo. Sto usando Oracle. Come faccio a sapere se sta andando bene?

Quindi, prima di andare a casa ho fatto una ALTER TABLE HUGETABLE Aggiungi vincolo PK_HUGETABLE PRIMARY KEY (ID1, ID2, ID3);

Mi aspettavo che funzionasse durante la notte, ma è già da oltre 24 ore e funziona ancora.

So che se avessi mantenuto l'ID sessione prima di iniziare la mia ricerca sarei in grado di rintracciarlo a V $ SESSION_LONGOPS. Ma non l'ho fatto.

C'è un modo per verificare come sta andando la mia domanda o quanto tempo ci vorrà ancora?

risposta

7

Si dovrebbe essere ancora in grado di interrogare V $ SESSION_LONGOPS. Se si esegue qualcosa come

SELECT sid, serial#, start_time, sofar, totalwork, time_remaining, message 
    FROM v$session_longops 
WHERE time_remaining > 0 

probabilmente vedrete solo una sessione che è iniziato ieri e le altre colonne dovrebbe corroborare che con le indicazioni che la sessione ha fatto un sacco di lavoro. Il MESSAGGIO dovrebbe anche indicare qualcosa come una scansione completa su HUGETABLE.

+0

Non riuscivo a trovarlo. Ho trovato un sacco di processi in corso, ma non sono riuscito a identificare il mio. Così ho rinunciato e l'ho cancellato :) Mi fermerò tutto durante il fine settimana e riproverò. Questa volta otterrò l'id della sessione prima di iniziare il lavoro. Grazie comunque. – Michael

+2

La prossima volta, definisci l'indice con PARALLEL n, dove n è un grado accettabile di parallelismo sul tuo sistema. Al termine, modificare l'indice in NOPARALLEL. Inoltre, se non si utilizza Data Guard e si può eseguire un backup del database una volta terminato, utilizzare la clausola NOLOGGING. –

0

Non è necessario ricordare l'id di sessione per monitorare lo stato di un'istruzione. Come suggerito da Justin, non dovresti avere troppe query a lungo termine dal giorno precedente. È possibile specificare anche l'ora di inizio per restringere i risultati.

select * from V$SESSION_LONGOPS where time_remaining > 0 and start_time > <'your run date/time here'>; 

Oltre opzione 'PARALLELA n', si consiglia di utilizzare l'opzione 'ONLINE' così se si sta creando (o ricostruzione) di un indice, mentre simultanea di lettura/scrittura sono in corso sul grande tavolo.

Problemi correlati