web-dev-qa-db-fra.com

Comment trouver les dernières instructions SQL dans la base de données?

J'aime obtenir les dernières instructions exécutées dans ma base de données, ainsi que des indicateurs de performance.

En tant que tel, j'aime savoir quelles instructions SQL étaient les plus gourmandes en ressources CPU/DISK.

25
Sebastian Roth

Voici le SQL pour faire le travail. Ouvert pour procès.

Étape 1: Déterminez les ID d'installation et les ID utilisateur.

SELECT inst_id,sid FROM gv$session WHERE username='<ENTER-USERNAME>';

Étape 2:

SELECT 
      s.sid
     ,s.CLIENT_INFO
     ,s.MACHINE
     ,s.PROGRAM
     ,s.TYPE
     ,s.logon_time
     ,s.osuser
     ,sq.sorts
     ,sq.DISK_READS
     ,sq.BUFFER_GETS
     ,sq.ROWS_PROCESSED
     ,sq.SQLTYPE
     ,sq.SQL_TEXT
 FROM gv$session s    
    , gv$sql sq
WHERE s.SQL_HASH_VALUE = sq.HASH_VALUE
  AND s.inst_id = :inst_id -- replace with instID from above
  AND s.sid = :sid -- replace with ID from above
  AND sq.inst_id = s.inst_id

Plusieurs ID et ID d'instance peuvent être renvoyés. Il appartient donc aux utilisateurs de choisir comment utiliser ces données dans une interface Web, etc.

17
Sebastian Roth

La console Oracles Enterprise Monitor affiche une multitude d'informations sur les requêtes SQL qui prennent le maximum de CPU, les goulots d'étranglement, l'activité principale dans la base de données, le blocage de SQL et al.

Pour une approche historique, vous pouvez utiliser les rapports d'Oracle AWR pour localiser les zones vous concernant.

alt text

enter image description here

13
Sathyajith Bhat

Vous pouvez aussi utiliser V$SQL, il y a plusieurs colonnes intéressantes RUNTIME_MEM, EXECUTIONS, DISK_READS, SORTS, ELAPSED_TIME, SQL_FULLTEXT etc.

Cela vous donnerait les 10 meilleures déclarations par lecture de disque (remarque - ceci est cumulatif pour toutes les exécutions):

select sql_id,child_number from
(
select sql_id,child_number from v$sql
order by disk_reads desc
)
where rownum<11

Si l'instruction est toujours dans V$SQL_PLAN vous pouvez obtenir un plan d'explication réel pour la requête:

select * from table(dbms_xplan.display_cursor('sql_id',child_number));

J'aime aussi utiliser V$SQL_PLAN car il contient de bonnes informations. Si votre statistics_level=ALL vous pouvez utiliser V$SQL_PLAN_STATISTICS.

4
gabrielp

Pour le SQL récent:

select * from v$sql

Pour l'histoire:

select * from dba_hist_sqltext
2
grokster