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.
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.
Réponses:
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.
in
opérateur avec des tuples, donc de l'exemple ci... AND (s.inst_id, s.sid) in ( (:id1, :sid1), (:id2, :sid2), ... )
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 AWR d'Oracle pour identifier les zones vous concernant.
Vous pouvez également utiliser V$SQL
, il existe plusieurs colonnes intéressantes, RUNTIME_MEM, EXECUTIONS, DISK_READS, SORTS, ELAPSED_TIME, SQL_FULLTEXT
etc.
Cela vous donnerait les 10 premières 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 présente, 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 l'utiliser V$SQL_PLAN
car il contient de bonnes informations. Si statistics_level=ALL
vous pouvez l'utiliser V$SQL_PLAN_STATISTICS
.