Dba highwater mark

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script SQL*Plus de diagnostic
Domaine Administration (segments / stockage)
Voir aussi Dba index fragmentation · Dba owner to tablespace

Dba highwater mark détermine le high water mark (HWM) d'une table, c'est-à-dire la limite haute des blocs ayant un jour contenu des données dans le segment.

Qu'est-ce que le high water mark

Tout segment Oracle (table, index...) a une limite haute de blocs alloués et utilisés au moins une fois : le HWM. Il progresse par paliers (plusieurs blocs à la fois) au fur et à mesure des insertions, mais ne redescend jamais tout seul suite à des DELETE — Oracle ne "rétrécit" pas un segment automatiquement. Seul un TRUNCATE (ou une reconstruction du segment) remet le HWM à zéro.

Conséquence pratique : un full table scan lit toujours jusqu'au HWM, même si l'essentiel des blocs en dessous sont vides suite à des suppressions massives. Une table ayant subi beaucoup de DELETE sans TRUNCATE ni réorganisation peut donc rester lente à scanner malgré un faible nombre de lignes réelles — c'est le symptôme classique qui amène à consulter le HWM.

Script

ACCEPT owner      CHAR PROMPT 'Owner : '
ACCEPT table_name CHAR PROMPT 'Table name : '

ANALYZE TABLE &&owner..&&table_name COMPUTE STATISTICS;

SELECT blocks
FROM   dba_segments
WHERE      owner        = UPPER('&&owner')
       AND segment_name = UPPER('&&table_name')
/

SELECT empty_blocks
FROM   dba_tables
WHERE      owner      = UPPER('&&owner')
       AND table_name = UPPER('&&table_name')
/

UNDEFINE owner
UNDEFINE table_name

Le HWM se calcule ensuite comme :

HWM = dba_segments.blocks - dba_tables.empty_blocks - 1

(le -1 correspond au bloc d'en-tête du segment, réservé et jamais compté dans les blocs de données).

Colonnes / sortie

  • dba_segments.blocks — nombre total de blocs alloués au segment (y compris au-dessus et en dessous du HWM).
  • dba_tables.empty_blocks — nombre de blocs alloués mais jamais utilisés, situés au-dessus du HWM.
  • La différence donne le nombre de blocs réellement "vus" par un full table scan.

Le script original s'appuie sur ANALYZE TABLE ... COMPUTE STATISTICS, la méthode historique (Oracle 7/8/9). Sur les versions modernes, deux alternatives sont généralement préférables :

  • DBMS_SPACE.UNUSED_SPACE — renvoie directement le HWM sans recalculer toutes les statistiques de la table.
  • Pour un segment en Automatic Segment Space Management (ASSM, le défaut depuis longtemps), DBMS_SPACE.SPACE_USAGE donne une vue plus fine (blocs pleins / partiels / vides sous le HWM).

Un HWM anormalement haut par rapport au volume réel de données est un bon indicateur pour envisager un ALTER TABLE ... SHRINK SPACE (tables en ASSM) ou un export/reload de la table.

Voir aussi