Oracle: esiste uno strumento per tracciare le query, come Profiler per sql server? [chiuso]


86

lavoro con sql server, ma devo migrare a un'applicazione con Oracle DB. per tracciare le mie query dell'applicazione, in Sql Server utilizzo il meraviglioso strumento Profiler. c'è qualcosa di equivalente per Oracle?


38
Perché hai accettato una risposta sbagliata? Spiegare il piano NON fa quello che fa il profiler. È totalmente estraneo.
Jasmine

1
hai trovato il miglior strumento come sql server profiler? cosa stai usando adesso?
Shahid Ghafoor

Ho scritto un libro sulla tracciabilità delle applicazioni Oracle. È disponibile in formato PDF su method-r.com .
Cary Millsap

Per favore, controlla il profiler Oracle in dbForge Studio per Oracle da Devart.
Devart

Molte risposte di seguito, ma stranamente nessuno ha menzionato nessuno dei due profiler Oracle per PL / SQL: DBMS_PROFILER(di base e limitato, ma super conveniente) o DBMS_HPROF(più accurato ma richiede più configurazione). Tuttavia, non conosco SQL Server, quindi è possibile che abbia un concetto diverso di profiling rispetto a uno dei pacchetti Oracle e ciò che desideri è più simile al tracciamento in Oracle.
William Robertson

Risposte:


22

È possibile utilizzare Oracle Enterprise Manager per monitorare le sessioni attive, con la query che viene eseguita, il suo piano di esecuzione, i blocchi, alcune statistiche e persino una barra di avanzamento per le attività più lunghe.

Vedere: http://download.oracle.com/docs/cd/B10501_01/em.920/a96674/db_admin.htm#1013955

Vai a Istanza -> sessioni e guarda la scheda SQL di ogni sessione.

Ci sono altri modi. Enterprise Manager mette semplicemente con bei colori ciò che è già disponibile in viste speciali come quelle documentate qui: http://www.oracle.com/pls/db92/db92.catalog_views?remark=homepage

E, naturalmente, puoi anche usare Explain PLAN FOR, lo strumento TRACE e tantissimi altri modi di strumentalizzazione. Ci sono alcuni rapporti in Enterprise Manager per le query SQL più costose. Puoi anche cercare query recenti conservate nella cache.


19

Ho trovato una soluzione facile

Passo 1. connettersi al DB con un utente amministratore utilizzando PLSQL o sqldeveloper o qualsiasi altra interfaccia di query

Passo 2. eseguire lo script qui sotto; nella colonna S.SQL_TEXT, vedrai le query eseguite

SELECT            
 S.LAST_ACTIVE_TIME,     
 S.MODULE,
 S.SQL_FULLTEXT, 
 S.SQL_PROFILE,
 S.EXECUTIONS,
 S.LAST_LOAD_TIME,
 S.PARSING_USER_ID,
 S.SERVICE                                                                       
FROM
 SYS.V_$SQL S, 
 SYS.ALL_USERS U
WHERE
 S.PARSING_USER_ID=U.USER_ID 
 AND UPPER(U.USERNAME) IN ('oracle user name here')   
ORDER BY TO_DATE(S.LAST_LOAD_TIME, 'YYYY-MM-DD/HH24:MI:SS') desc;

L'unico problema con questo è che non riesco a trovare un modo per mostrare i valori dei parametri di input (per le chiamate di funzione), ma almeno possiamo vedere cosa viene eseguito in Oracle e l'ordine di esso senza utilizzare uno strumento specifico.


2
È possibile aggiungere S.SQL_FULLTEXT se il testo della query supera i 1000 caratteri, poiché SQL_TEXT viene troncato a quel punto.
Tridus

2
Non dovresti ordinare entro il LAST_ACTIVE_TIME perché è VARCHAR2 (19). Usa questo invece: ORDER BY TO_DATE (S.LAST_LOAD_TIME, 'YYYY-MM-DD / HH24: MI: SS') desc
Igor Krupitsky

1
ORA-00942: la tabella o la vista non esiste 00942. 00000 - "la tabella o la vista non esiste" * Causa: * Azione: Errore alla riga: 11 Colonna: 6 Significa che non ho alcun privilegio di amministratore?
toha

Questo non include i valori di parametro. se si vuole avere anche questo, dare un'occhiata a: stackoverflow.com/a/14217618/6339469
HamedH

16
alter system set timed_statistics=true

--o

alter session set timed_statistics=true --if want to trace your own session

- deve essere abbastanza grande:

select value from v$parameter p
where name='max_dump_file_size' 

- Scopri sid e numero di serie della sessione a cui sei interessato:

 select sid, serial# from v$session
 where ...your_search_params...

- puoi iniziare a tracciare con 10046 eventi, il quarto parametro imposta il livello di traccia (12 è il più grande):

 begin
    sys.dbms_system.set_ev(sid, serial#, 10046, 12, '');
 end;

- disattivare il tracciamento con l'impostazione del livello zero:

begin
   sys.dbms_system.set_ev(sid, serial#, 10046, 0, '');
end;

/ * livelli possibili: 0 - disattivato 1 - livello minimo. Proprio come set sql_trace = true 4 - i valori delle variabili di bind vengono aggiunti al file di traccia 8 - vengono aggiunte le attese 12 - vengono aggiunti sia i valori delle variabili di bind che gli eventi di attesa * /

- lo stesso se vuoi tracciare la tua sessione con un livello maggiore:

alter session set events '10046 trace name context forever, level 12';

--Spegni:

alter session set events '10046 trace name context off';

- il file con le informazioni di traccia non elaborate verrà individuato:

 select value from v$parameter p
 where name='user_dump_dest'

--name del file (*. trc) conterrà spid:

 select p.spid from v$session s, v$process p
 where s.paddr=p.addr
 and ...your_search_params...

- inoltre puoi impostare il nome da solo:

alter session set tracefile_identifier='UniqueString'; 

- infine, utilizzare TKPROFper rendere il file di traccia più leggibile:

C:\ORACLE\admin\databaseSID\udump>
C:\ORACLE\admin\databaseSID\udump>tkprof my_trace_file.trc output=my_file.prf
TKPROF: Release 9.2.0.1.0 - Production on Wed Sep 22 18:05:00 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
C:\ORACLE\admin\databaseSID\udump>

- per visualizzare lo stato di utilizzo del file di traccia:

set serveroutput on size 30000;
declare
  ALevel binary_integer;
begin
  SYS.DBMS_SYSTEM.Read_Ev(10046, ALevel);
  if ALevel = 0 then
    DBMS_OUTPUT.Put_Line('sql_trace is off');
  else
    DBMS_OUTPUT.Put_Line('sql_trace is on');
  end if;
end;
/

Solo un po 'tradotto http://www.sql.ru/faq/faq_topic.aspx?fid=389 L' originale è più pieno, ma comunque questo è meglio di quello che altri hanno pubblicato IMHO


Molto più utile delle altre risposte!
Andomar

Troppo complicato. Nessuno lo userà.
ADM-IT

7

GI Oracle Profiler v1.2

È uno strumento per Oracle per acquisire query eseguite in modo simile a SQL Server Profiler. Strumento indispensabile per la manutenzione delle applicazioni che utilizzano questo database server.

puoi scaricarlo dal sito ufficiale iacosoft.com


Ciao, hai bisogno di una licenza speciale da ORACLE per utilizzare questo software? So che Oracle ti consente di interagire con determinate tabelle / viste e, se lo fai e non hai una licenza, ti fanno pagare un extra.
sergiu

2
Ciao, devi pagare per interrogare v $ sqlarea? Posso inserire il link che dice cosa?
pio

eccellente grazie amico !!! Mi risparmi un sacco di lavoro
Hernaldo Gonzalez

Se la mia query fallisce, non viene mostrata dal profiler.
ADM-IT


5

Visto che ho appena votato una domanda recente come un duplicato e ho puntato in questa direzione. . .

Un altro paio - in SQL * Plus - SET AUTOTRACE ON - spiegheranno il piano e le statistiche per ogni istruzione eseguita.

TOAD consente anche la profilazione lato client.

Lo svantaggio di entrambi è che ti dicono solo il piano di esecuzione per l'istruzione, ma non come l'ottimizzatore è arrivato a quel piano - per questo avrai bisogno di una traccia lato server di livello inferiore.

Un altro importante da capire sono gli snapshot di Statspack: sono un buon modo per guardare le prestazioni del database nel suo insieme. Spiegare il piano, ecc., Sono bravi a trovare singole istruzioni SQL che sono colli di bottiglia. Statspack è bravo a identificare il fatto che il tuo problema è che una semplice istruzione con un buon piano di esecuzione viene chiamata 1 milione di volte in un minuto.


3

The Catch is Capture all SQL run tra due punti nel tempo. Come fa anche SQL Server.

Ci sono situazioni in cui è utile acquisire l'SQL che un particolare utente sta eseguendo nel database. Di solito si abilita semplicemente la traccia della sessione per quell'utente, ma ci sono due potenziali problemi con questo approccio.

  1. Il primo è che molte applicazioni basate sul Web mantengono un pool di connessioni al database persistenti condivise tra più utenti.
  2. Il secondo è che alcune applicazioni si connettono, eseguono un po 'di SQL e si disconnettono molto rapidamente, rendendo difficile abilitare il tracciamento della sessione (in questo caso potresti ovviamente utilizzare un trigger di accesso per abilitare il tracciamento della sessione).

Una soluzione rapida e sporca al problema è acquisire tutte le istruzioni SQL eseguite tra due punti nel tempo.

La procedura seguente creerà due tabelle, ciascuna contenente un'istantanea del database in un punto particolare. Le tabelle verranno quindi interrogate per produrre un elenco di tutti gli SQL eseguiti durante quel periodo.

Se possibile, dovresti farlo su un sistema di sviluppo silenzioso, altrimenti rischi di recuperare troppi dati.

  1. Acquisisci il primo snapshot Esegui il seguente sql per creare il primo snapshot:

    create table sql_exec_before as
    select executions,hash_value
    from v$sqlarea
    /
    
  2. Convinci l'utente a svolgere il proprio compito all'interno dell'applicazione.

  3. Scatta la seconda istantanea.

    create table sql_exec_after as
    select executions, hash_value
    from v$sqlarea
    /
    
  4. Controllare i risultati Ora che hai acquisito l'SQL è il momento di interrogare i risultati.

Questa prima query elencherà tutti gli hash delle query che sono stati eseguiti:

select  aft.hash_value
from sql_exec_after aft
left outer join sql_exec_before bef
  on aft.hash_value  =  bef.hash_value 
where aft.executions > bef.executions
   or bef.executions is null;
/

Questo mostrerà l'hash e lo stesso SQL: imposta le pagine 999 righe 100 interrotte su hash_value

select  hash_value, sql_text
from    v$sqltext
where   hash_value in (
    select  aft.hash_value
    from sql_exec_after aft
    left outer join sql_exec_before bef
      on aft.hash_value  =  bef.hash_value
    where aft.executions > bef.executions
       or bef.executions is null;
)
order by
    hash_value, piece
/

5. Riordinare Non dimenticare di rimuovere le tabelle delle istantanee una volta terminato:

drop table sql_exec_before
/

drop table sql_exec_after
/

Grazie per gli script completi che dimostrano la tecnica.
Roman Pokrovskij

2

Oracle, insieme ad altri database, analizza una determinata query per creare un piano di esecuzione. Questo piano è il modo più efficiente per recuperare i dati.

Oracle fornisce l' explain planistruzione " " che analizza la query ma non la esegue, popolando invece una tabella speciale che è possibile interrogare (la tabella del piano).

La sintassi (versione semplice, ci sono altre opzioni come contrassegnare le righe nella tabella del piano con un ID speciale, o utilizzare una tabella del piano diversa) è:

explain plan for <sql query>

L'analisi di quei dati è lasciata per un'altra domanda, o per le tue ulteriori ricerche.



1

Questo è un documento Oracle che spiega come tracciare le query SQL, inclusi un paio di strumenti (SQL Trace e tkprof)

collegamento


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.