Comment puis-je consulter les plans d'exécution capturés par Statspack pour une instance de base de données Amazon RDS Oracle ?

Date de la dernière mise à jour : 13/03/2020

J'ai capturé des statistiques de performance pour mon instance de base de données Amazon Relational Database Service (Amazon RDS) Oracle à l'aide de Statspack. Le rapport Statspack ne comporte cependant aucune information sur les plans d'exécution. Comment puis-je consulter les plans d'exécution pour les requêtes qui ont été capturées par Statspack ?

Solution

1.    Prenez un instantané Statspack dont le niveau d'alignement est supérieur ou égal à 6 (i_snap_level => 6) pour capturer des plans d'exécution SQL. Pour obtenir des informations supplémentaires, consultez la section Comment puis-je vérifier les statistiques de performances sur une instance de base de données Amazon RDS qui exécute Oracle ?

2.    Vérifiez la valeur Begin Snap ID, la valeur End Snap ID et l'ancienne valeur de hachage de la requête à l'aide du rapport Statspack. Dans l'exemple suivant, la valeur Begin Snap ID correspond à 22 et la valeur End Snap ID à 23 :

STATSPACK report for
Database    DB Id    Instance     Inst Num  Startup Time   Release     RAC
~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---
          1234567890 silent              1 03-Jan-20 00:45 12.2.0.1.0  NO
Host Name             Platform                CPUs Cores Sockets   Memory (G)
~~~~ ---------------- ---------------------- ----- ----- ------- ------------
     ip-172-31-22-176 Linux x86 64-bit           2     2       1          3.7
Snapshot       Snap Id     Snap Time      Sessions Curs/Sess Comment
~~~~~~~~    ---------- ------------------ -------- --------- ------------------
Begin Snap:         22 03-Jan-20 01:30:36       41        .8
  End Snap:         23 03-Jan-20 01:39:12       40        .8
   Elapsed:       8.60 (mins) Av Act Sess:       0.0
   DB time:       0.11 (mins)      DB CPU:       0.11 (mins)
...

3.    Recherchez la requête pour consulter le plan d'exécution à l'aide de l'ancienne valeur de hachage. Le rapport Statspack inclut différentes sections intitulées « En fonction de ». Par exemple, la section « En fonction de l'utilisation du processeur » répertorie les requêtes induisant une utilisation intensive du processeur. L'exemple suivant inclut l'ancienne valeur de hachage 73250552, qui correspond à la valeur de hachage associée à la requête induisant l'utilisation la plus intensive du processeur à ce moment-là :

...
SQL ordered by CPU  DB/Inst: SILENT/silent  Snaps: 22-23
-> Total DB CPU (s):               7
-> Captured SQL accounts for   80.3% of Total DB CPU
-> SQL reported below exceeded  1.0% of Total DB CPU
    CPU                  CPU per             Elapsd                     Old
  Time (s)   Executions  Exec (s)  %Total   Time (s)    Buffer Gets  Hash Value
---------- ------------ ---------- ------ ---------- --------------- ----------
      4.03            3       1.34   60.8       4.08         528,477   73250552
Module: SQL*Plus
SELECT COUNT(*) FROM HOGE_TBL H1 INNER JOIN HOGE_TBL H2 USING(OB
JECT_NAME)
      0.75            1       0.75   11.3       0.77          18,994 2912400228
Module: sqlplus@ip-172-31-22-176 (TNS V1-V3)
BEGIN statspack.snap; END;
      0.14          107       0.00    2.1       0.15             732 3879834072
select TIME_WAITED_MICRO from V$SYSTEM_EVENT  where event = 'Sha
red IO Pool Memory'
...

3.    Connectez-vous à l'instance de base de données à l'aide d'un client Oracle, comme SQL*Plus.

4.    Appelez une requête similaire à la suivante pour accéder au plan d'exécution :

SELECT lpad(' ', 1 * ( depth - 1 ))
     || operation AS operation,
       object_name,
       cardinality,
       bytes,
       cost
FROM   stats$sql_plan
WHERE  plan_hash_value IN(SELECT plan_hash_value
                          FROM   stats$sql_plan_usage
                          WHERE  old_hash_value = OLD_HASH_VALUE
                                 AND snap_id BETWEEN BEGIN_SNAP_ID AND END_SNAP_ID
                                 AND plan_hash_value > 0)
ORDER  BY plan_hash_value, id;

Remarque : remplacez OLD_HASH_VALUE, BEGIN_SNAP_ID et END_SNAP_ID par vos propres valeurs.

L'exemple suivant correspond au plan d'exécution de la requête récupérée par SQL*Plus :

SQL> col operation format a20
col object_name format a20
SQL>SELECT lpad(' ', 1 * ( depth - 1 ))
     || operation AS operation,
       object_name,
       cardinality,
       bytes,
       cost
FROM   stats$sql_plan
WHERE  plan_hash_value IN(SELECT plan_hash_value
                          FROM   stats$sql_plan_usage
                          WHERE  old_hash_value = 73250552
                                 AND snap_id BETWEEN 22 AND 23
                                 AND plan_hash_value > 0)
OPERATION            OBJECT_NAME          CARDINALITY      BYTES       COST
-------------------- -------------------- ----------- ---------- ----------
SELECT STATEMENT                                                       1119
SORT                                                1         70
 HASH JOIN                                      87756    6142920       1119
  TABLE ACCESS       HOGE_TBL                   72992    2554720        397
  TABLE ACCESS       HOGE_TBL                   72992    2554720        397

Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d’aide ?