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.
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.
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.
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
.
Pour le SQL récent:
select * from v$sql
Pour l'histoire:
select * from dba_hist_sqltext