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

25

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.

Sebastian Roth
la source

Réponses:

17

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.

Sebastian Roth
la source
Juste une petite note: Oracle prend en charge (aucune idée de quelle version) l' inopérateur avec des tuples, donc de l'exemple ci... AND (s.inst_id, s.sid) in ( (:id1, :sid1), (:id2, :sid2), ... )
Betlista
1
'inst_id' représente l'ID d'instance, cela ne signifie pas l'ID d'installation.
miracle173
13

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.

texte alternatif

entrez la description de l'image ici

Sathyajith Bhat
la source
1
Par curiosité - AWR est un outil disponible pour toutes les licences Oracle et puis-je l'utiliser uniquement en ligne de commande?
Sebastian Roth
2
Désolé, j'aurais dû le mentionner - d'après ce que je sais, AWR nécessite une licence distincte - Oracle Tuning & Diagnostic Pack . Je préfère utiliser AWR à partir de la console Enterprise Manager - j'ai eu le privilège (!) D'utiliser la console Enterprise Manager. J'ai également constaté que vous pouvez utiliser SQL Developer pour surveiller les SQL, mais cela nécessite la licence ci-dessus
Sathyajith Bhat
1
Oracle Enterprise Manager (OEM) est très agréable. Nous pouvons surveiller la santé de notre base de données en temps quasi réel avec des graphiques actualisés automatiquement. Nous avons un grand moniteur accroché sur un mur montrant OEM pour nos bases de données primaires 24x7 et son extrêmement bénéfique pour identifier les problèmes lorsqu'ils se produisent.
ScottCher
4

Vous pouvez également utiliser V$SQL, il existe plusieurs colonnes intéressantes, RUNTIME_MEM, EXECUTIONS, DISK_READS, SORTS, ELAPSED_TIME, SQL_FULLTEXTetc.

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_PLANvous 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_PLANcar il contient de bonnes informations. Si statistics_level=ALLvous pouvez l'utiliser V$SQL_PLAN_STATISTICS.

Gabrielp
la source
2

Pour SQL récent:

select * from v$sql

Pour l'histoire:

select * from dba_hist_sqltext
grokster
la source