web-dev-qa-db-fra.com

Quelles requêtes Oracle exécute-t-il, à quelle fréquence et en combien de temps?

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?

5
Jasper

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.:

  • ELAPSED_TIME_DELTA
  • CPU_TIME_DELTA
  • ROWS_PROCESSED_DELTA
  • BUFFER_GETS_DELTA
  • DISK_READS_DELTA
  • PARSE_CALLS_DELTA
  • EXECUTIONS_DELTA

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 .

10
Chris Saxon