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
Informations connexes
Comment puis-je vérifier les statistiques de performances sur une instance de base de données Amazon RDS qui exécute Oracle ?
Oracle Statspack
Documentation Oracle relative à l'utilisation de Statspack