Session plus consommatrices

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script SQL*Plus de diagnostic
Voir aussi Sess users by CPU · Sql

Session plus consommatrices affiche, via un bloc PL/SQL utilisant DBMS_OUTPUT, les N requêtes SQL les plus coûteuses actuellement en mémoire dans le library cache (v$sqlarea), triées par nombre moyen de lectures disque par exécution. N est demandé à l'exécution (variable de substitution &top).

À la différence de la famille Sess users by CPU (qui identifie quelle session consomme), ce script s'intéresse à quelle requête SQL consomme, toutes sessions confondues — les deux angles sont complémentaires pour un diagnostic de performance complet. Voir aussi Sql pour le langage lui-même.

Script

SET LINESIZE 500
SET PAGESIZE 1000
SET FEEDBACK OFF
SET VERIFY OFF
SET SERVEROUTPUT ON

BEGIN

  Dbms_Output.Enable(1000000);

  Dbms_Output.Put_Line(Rpad('SQL Text',50,' ') ||
                       Lpad('Reads/Execution',16,' ') ||
                       Lpad('Buffer Gets',12,' ') ||
                       Lpad('Disk Reads',12,' ') ||
                       Lpad('Executions',12,' ') ||
                       Lpad('Sorts',12,' ') ||
                       Lpad('Address',10,' '));
  Dbms_Output.Put_Line(Rpad('-',50,'-') || ' ' ||
                       Lpad('-',15,'-') || ' ' ||
                       Lpad('-',11,'-') || ' ' ||
                       Lpad('-',11,'-') || ' ' ||
                       Lpad('-',11,'-') || ' ' ||
                       Lpad('-',11,'-') || ' ' ||
                       Lpad('-',9,'-'));

  FOR cur_rec IN (SELECT * FROM (SELECT Substr(a.sql_text,1,50) sql_text,
                    Trunc(a.disk_reads/Decode(a.executions,0,1,a.executions)) reads_per_execution,
                         a.buffer_gets,
                         a.disk_reads,
                         a.executions,
                         a.sorts,
                         a.address
                  FROM   v$sqlarea a
                                ORDER BY 2 DESC) WHERE ROWNUM <= &top) LOOP
    Dbms_Output.Put_Line(Rpad(cur_rec.sql_text,50,' ') ||
                         Lpad(cur_rec.reads_per_execution,16,' ') ||
                         Lpad(cur_rec.buffer_gets,12,' ') ||
                         Lpad(cur_rec.disk_reads,12,' ') ||
                         Lpad(cur_rec.executions,12,' ') ||
                         Lpad(cur_rec.sorts,12,' ') ||
                         Lpad(cur_rec.address,10,' '));

  END LOOP;

END;
/

L'appel Dbms_Output.Enable(1000000) fixe explicitement la taille du tampon de sortie — un réglage hérité des versions antérieures à Oracle 10g Release 2, où la taille par défaut était limitée (2000 octets, avec un maximum réglable jusqu'à 1 Mo). Depuis 10gR2, le tampon est illimité par défaut et cet appel est sans effet, mais reste inoffensif.

Voir aussi

  • Sess users by CPU — approche complémentaire par session plutôt que par requête
  • Sql — langage SQL