J'ai une application web (Java), qui exécute bien sûr de nombreuses requêtes (sélections, insertions, mises à jour, suppressions) sur la base de données Oracle.
Je veux savoir ce qui suit pour 7 derniers jours:
SQLQuery Times-Executed Average-Resp-Time Average-Rows-Returned
====================================================================================
SELECT whatever 981 330ms 1201
UPDATE whatever 45 99ms 0
Est-ce quelque chose qu'Oracle peut me donner? Si oui, comment puis-je l'obtenir? Si ce n'est pas Oracle, dois-je regarder le pilote JDBC?
Remarque : L'utilisation des données AWR nécessite d'avoir le Pack de diagnostics option de licence achetée. Il peut être possible d'exécuter les requêtes ci-dessous sans avoir la licence nécessaire. Assurez-vous de vérifier auprès de votre DBA/gestionnaire de licences avant de les utiliser.
Le référentiel de charge de travail automatique (AWR) contient des détails sur l'activité de votre base de données. Ceux-ci sont stockés dans divers dba_hist*
vues.
Le type d'informations que vous recherchez est principalement disponible dans le dba_hist_sqlstat
vue. En joignant ceci à dba_hist_snapshot
vous pouvez obtenir les informations disponibles dans une période donnée:
select *
from dba_hist_sqlstat t, dba_hist_snapshot s
where t.snap_id = s.snap_id
and t.dbid = s.dbid
and t.instance_number = s.instance_number
and s.begin_interval_time between trunc(sysdate)-1 and trunc(sysdate) -- yesterday's stats
Cette vue contient divers *_elapsed
colonnes, qui indiquent l'augmentation de l'instantané donné (période). par exemple.:
Les temps sont en microsecondes. Vous pouvez les combiner pour obtenir des statistiques de temps/exécution moyennes, etc. Par exemple, cela vous donne le temps moyen/exécution pour une instruction sql donnée:
select sql_id, sum(t.elapsed_time_delta/1000000)/sum(t.executions_delta)
from dba_hist_sqlstat t, dba_hist_snapshot s
where t.snap_id = s.snap_id
and t.dbid = s.dbid
and t.instance_number = s.instance_number
and s.begin_interval_time between trunc(sysdate)-1 and trunc(sysdate) -- yesterday's stats
group by sql_id
Le sql_id
est un hachage du texte du SQL lui-même. Vous pouvez trouver la déclaration réelle à partir de:
select * from dba_hist_sqltext where sql_id = :sqlid
Notez que seules les instructions "les plus consommatrices" sont conservées dans AWR. Donc, si la requête qui vous intéresse n'est pas la plus lente, la plus exécutée, la plupart des accès au disque, etc., elle peut ne pas figurer dans les données AWR. Vous pouvez contourner ce problème en "colorant" sql_ids d'intérêt. Cela garantit qu'ils restent dans AWR aussi longtemps que votre période de rétention est définie. Vous pouvez le faire en exécutant:
exec DBMS_WORKLOAD_REPOSITORY.ADD_COLORED_SQL(:sqlid);
Si vous voulez juste un aperçu de votre système dans une période de temps (y compris les instructions SQL "les plus lourdes"), le rapport AWR lui-même vous le donne. Vous pouvez trouver une introduction à cela sur Oracle-base .