Perf performance snapshot

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script SQL*Plus de diagnostic
Domaine Performance
Voir aussi Perf hit ratio system · Perf redo log contention · Perf sga usage

Perf performance snapshot produit en une seule exécution un petit rapport de synthèse couvrant les principaux indicateurs de performance d'une instance : date de démarrage, hit ratio du buffer cache, hit ratio du dictionnaire de données, hit ratio de la library cache, statistiques du redo log buffer, latches en contention et attentes sur les segments d'annulation. Pratique en premier réflexe de diagnostic, avant d'aller creuser un indicateur précis avec l'un des scripts dédiés de cette catégorie.

Script

SET LINESIZE 145
SET PAGESIZE 9999
SET VERIFY   OFF

PROMPT
PROMPT +-----------------------------------+
PROMPT | Date/heure de démarrage            |
PROMPT +-----------------------------------+
PROMPT

SELECT instance "Instance", open_time "Date/heure d'ouverture"
FROM   v$thread
/

PROMPT
PROMPT +-----------------------------------+
PROMPT | Buffer Cache Hit Ratio             |
PROMPT +-----------------------------------+
PROMPT

SELECT
    TRUNC(
        ( 1 - ( SUM(DECODE(name, 'physical reads', value, 0))
                / ( SUM(DECODE(name, 'db block gets', value, 0))
                  + SUM(DECODE(name, 'consistent gets', value, 0))
                  )
              )
        ) * 100
    ) "Buffer Hit Ratio"
FROM v$sysstat
/

SELECT
    a.value + b.value                                   "Logical reads"
  , c.value                                              "Physical Reads"
  , d.value                                              "Physical Writes"
  , ROUND(100 * ((a.value + b.value) - c.value) / (a.value + b.value)) "Buffer Hit Ratio"
  , ROUND(c.value * 100 / (a.value + b.value))           "% Missed"
FROM
    (SELECT value FROM v$sysstat WHERE name = 'db block gets')   a
  , (SELECT value FROM v$sysstat WHERE name = 'consistent gets') b
  , (SELECT value FROM v$sysstat WHERE name = 'physical reads')  c
  , (SELECT value FROM v$sysstat WHERE name = 'physical writes') d
/

PROMPT
PROMPT +-----------------------------------+
PROMPT | Data Dictionary Hit Ratio          |
PROMPT +-----------------------------------+
PROMPT

SELECT
    SUM(gets)                                    "Data Dict. Gets"
  , SUM(getmisses)                                "Data Dict. Cache Misses"
  , ROUND((1 - (SUM(getmisses) / SUM(gets))) * 100) "Data Dict Cache Hit Ratio"
  , ROUND(SUM(getmisses) * 100 / SUM(gets))       "% Missed"
FROM v$rowcache
/

PROMPT
PROMPT +-----------------------------------+
PROMPT | Library Cache Miss Ratio           |
PROMPT +-----------------------------------+
PROMPT

SELECT
    SUM(pins)                                 "Executions"
  , SUM(reloads)                              "Cache Misses"
  , ROUND((1 - (SUM(reloads) / SUM(pins))) * 100) "Library Cache Hit Ratio"
  , ROUND(SUM(reloads) * 100 / SUM(pins))     "% Missed"
FROM v$librarycache
/

SELECT
    namespace              "Namespace"
  , TRUNC(gethitratio * 100) "Hit Ratio"
  , TRUNC(pinhitratio * 100) "Pin Hit Ratio"
  , reloads                 "Reloads"
  , invalidations           "Invalidations"
FROM v$librarycache
/

PROMPT
PROMPT +-----------------------------------+
PROMPT | Redo Log Buffer                    |
PROMPT +-----------------------------------+
PROMPT

SELECT SUBSTR(name, 1, 30) "Name", TO_CHAR(value, '999,999') "Valeur"
FROM   v$sysstat
WHERE  name = 'redo log space requests'
/

SELECT name "Name", TO_CHAR(bytes, '999,999,999,999') "Bytes"
FROM   v$sgastat
WHERE  name = 'free memory'
/

SELECT
    TO_CHAR(SUM(executions), '999,999,999,999,999,999')  "Total SQL depuis démarrage"
  , TO_CHAR(SUM(users_executing), '999,999,999,999,999') "SQL en cours d'exécution"
FROM v$sqlarea
/

PROMPT
PROMPT +----------------------------------------------------------+
PROMPT | Si Miss Ratio ou Immd. Miss Ratio > 1 il y a contention   |
PROMPT | sur ce latch (revoir le dimensionnement associé)          |
PROMPT +----------------------------------------------------------+
PROMPT

SELECT
    SUBSTR(ln.name, 1, 30)                             "Name"
  , (misses / (gets + .001)) * 100                      "Miss Ratio"
  , (immediate_misses / (immediate_gets + .001)) * 100   "Immd. Miss Ratio"
FROM
    v$latch     l
  , v$latchname ln
WHERE
    l.latch# = ln.latch#
  AND ( ((misses / (gets + .001)) * 100 > .1)
        OR ((immediate_misses / (immediate_gets + .001)) * 100 > .1)
      )
ORDER BY ln.name
/

PROMPT
PROMPT +-----------------------------------------------------------+
PROMPT | Si ces valeurs représentent plus de 1% du total des        |
PROMPT | requêtes de données, des segments d'annulation             |
PROMPT | supplémentaires (ou plus grands) sont nécessaires.          |
PROMPT +-----------------------------------------------------------+
PROMPT

SELECT class "Class", count "Count"
FROM   v$waitstat
WHERE  class IN ('free list', 'system undo header', 'system undo block', 'undo header', 'undo block')
GROUP BY class, count
/

PROMPT
PROMPT +-----------------------------------+
PROMPT | Total des requêtes de données      |
PROMPT +-----------------------------------+
PROMPT

SELECT TO_CHAR(SUM(value), '999,999,999,999,999') "Total Requests"
FROM   v$sysstat
WHERE  name IN ('db block gets', 'consistent gets')
/

Correction apportée par rapport au script d'origine : le second calcul de Buffer Hit Ratio utilisait des identifiants numériques figés (statistic# = 37, 38, 39, 40) pour retrouver les compteurs db block gets/consistent gets/physical reads/physical writes. Ces numéros ne sont pas stables d'une version d'Oracle à l'autre (les identifiants de v$sysstat sont réattribués au fil des versions) : la requête ci-dessus les remplace par une sélection sur name, robuste à toute version.

Interprétation

  • Voir en détail Perf hit ratio system pour la lecture du Buffer Cache Hit Ratio.
  • Data Dictionary Hit Ratio bas (< 95 %) : le cache de dictionnaire (SHARED_POOL_SIZE) est sous-dimensionné pour le nombre d'objets de la base — impacte le parsing de toutes les requêtes.
  • Library Cache Hit Ratio bas ou reloads/invalidations élevés : requêtes non partagées (absence de bind variables), shared pool trop petit, ou invalidations fréquentes de plans suite à des DDL/statistiques recalculées en pleine activité.
  • Section latches : reprend le même principe que Perf lru latch contention et Perf redo log contention, mais généralisé à tous les latches de l'instance dépassant le seuil de 0,1 %.
  • Attentes sur segments d'annulation (undo/rollback) : sur les versions récentes en mode Automatic Undo Management, ces classes de wait sont rares ; leur présence signale plutôt un tablespace UNDO sous-dimensionné ou une rétention insuffisante (UNDO_RETENTION) qu'un problème de rollback segments manuels.

Voir aussi