2015-04-29 6 views
10

Sono nuovo di Oracle e ora sto diventando pazzo con la seguente situazione. Sto lavorando su un database Oracle 11g e molte volte succede che eseguo una query con lo sviluppatore sql e questo viene eseguito correttamente in 5/6 secondi, altri invece la stessa query impiega 300/400 secondi per essere eseguita. Esistono alcuni strumenti per eseguire il debug di ciò che accade quando la query impiega 300/400 secondi?Domanda molto lenta dopo alcune esecuzioni

Update 1 Questo è il mio SQL Developer screenshot del problema sembra essere percorso diretto Temp leggere

enter image description here

Aggiornamento 2 report

Update 3 0.123.305,205637 millions

Qualche suggerimento?

+0

È possibile eseguire questo e pubblicare l'output? 'seleziona dbms_sqltune.report_sql_monitor (sql_id => 'gvqwuz1u29s0f', type => 'text') da dual;' –

+2

solo una supposizione (e non riesco a vedere la tua immagine btw), se a volte esegui una query ed è molto più veloce di altre volte, probabilmente stai tirando i blocchi dalla cache, e l'esecuzione più lenta potrebbe significare che i blocchi erano invecchiati e dovevano essere ricaricati. Solo una supposizione, ma eseguendo una traccia ti dirò di più cosa sta succedendo – tbone

+0

@JonHeller Ho aggiornato la mia domanda con il rapporto del seguente sql statementdbms_sqltune.report_sql_monitor (sql_id => 'SQL_ID', type => 'text') da dual; – Skizzo

risposta

9

Provare a impostare una traccia. Utente in fase di qualunque utente sta vivendo il ritardo
Come sys:

GRANT ALTER SESSION TO USER; 

Come l'utente che esegue la traccia:

ALTER SESSION SET EVENTS '10046 trace name context forever, level 8'; 
ALTER SESSION SET TRACEFILE_IDENTIFIER = "MY_TEST_SESSION"; 

generare l'errore/problema, poi come il test utente:

ALTER SESSION SET EVENTS '10046 trace name context off'; 

Come sistema scoprire dove sono conservati i file di traccia:

show parameter background_dump_dest; 

Passare a tale directory e cercare i file .trc/.trm contenenti MY_TEST_SESSION. Ad esempio ORCL_ora_29772_MY_TEST_SESSION.trc.
Dopo aver eseguito questi file. In linux:

tkprof ORCL_ora_29772_MY_TEST_SESSION.trc output=ORCL_ora_29772_MY_TEST_SESSION.tkprof explain=user/password sys=no 

Leggi il file tkprof e ti mostrerà i tempi di attesa in determinate dichiarazioni.
Per ulteriori informazioni su TKPROF leggere this. Per maggiori informazioni sull'abilitazione/disabilitazione di una traccia, leggere this.

3

Lo strumento migliore è Real-Time SQL Monitoring. Non richiede la modifica del codice o l'accesso al sistema operativo. L'unico svantaggio è che richiede la licenza del Tuning Pack.

Confrontare questa singola riga di codice con i passaggi di traccia nell'altra risposta. Inoltre, l'output sembra molto più bello.

select dbms_sqltune.report_sql_monitor(sql_id => 'your sql id', type => 'text') from dual; 

Non c'è quasi mai bisogno di usare traccia in 11g e oltre.

+2

Quindi l'unico lato negativo è $ 15k? ;) – mmmmmpie

+0

@mmmmmpie Sì, è tutto! Ehi, la tua azienda ha già pagato qualche milione per Oracle, potrebbe anche avere questa fantastica opzione. :) Se il pacchetto di ottimizzazione non è disponibile, è possibile ricreare la funzione con [uno strumento open source che ho creato] (https://github.com/jonheller1/hist_sql_mon). Dipende però da AWR, che richiede anche soldi. Ad ogni modo, il punto è che Oracle ha tutti questi meccanismi che registrano silenziosamente i dati delle prestazioni. Se possibile, l'utilizzo di uno di questi è in genere più comodo rispetto alla gestione della traccia. –

+0

Posso confermare che se gestisci il supporto Oracle vorranno tracce di tkprof, nient'altro. – mmmmmpie

0

Questo comportamento può essere causato da bug/problemi di feedback sulla cardinalità in 11gR2. Ho avuto un problema simile. È possibile verificare se questo è il caso disattivando questa funzionalità con _optimizer_use_feedback=false

Prova anche ad applicare gli ultimi aggiornamenti.