!
!
!
!
!
!
!
!

White Paper
High Water Mark
Qu’est ce que c’est le high water mark ?
Le high water mark est une notion (;-)) qui pointe vers le dernier bloc qui a jamais contenu des données dans un segment. Pendant un full table scan, c’est la seule indication pour Oracle de s’arrêter ‘au dernier enregistrement’. A la création du segment, le HWM est à zéro.
Le désavantage de la présence du HWM est rendu évident si pratiquement tous les enregistrements d’une table sont supprimés : le HWM reste là ou il était. Pour le descendre, soit TRUNCATE (Mac Gyver), soit export, recréation, import. J’associe le HWM au thermomètre médical au mercure. Le mercure reste à la température maximale, pour descendre il faut secouer ;-).

FREELISTS

Quand Oracle a besoin d’un bloc pour insérer des données, il le cherche dans la FREELIST de la table et récupère le bloc dans la tête de cette liste. Si aucun bloc convenable n’est trouvé (un bloc peut être sur la freelist, bien qu’il n’a pas ASSEZ d’espace contigu nécessaire pour les grosses insertions) (un bloc est présent dans la freelist soit s’il est vierge, soit s’il a déjà atteint le PCTFREE, il a été enlevé de la freelist, mais il a été remis parce que les DELETE ultérieures ont rendu plus de PCTUSED octets libres). Si aucun bloc convenable n’a pas été retrouvé parmi les premiers blocvs de la freelist (il ne va pas TOUT balayer), il avance le high water mark qui pointe vers le dernier bloc du segment qui a jamais contenu des données. Si aucun bloc n’est disponible apres le high water mark (fin d’extent), un autre extent sera alloué (et la freelist repeuplée).

La clause deallocate

La clause DEALLOCATE libère l'espace non utilisé dans les EXTENTS (valable pour une table, cluster ou index) et implicitement le rend disponible pour d'autres objets dans le tablespace.
Alter table MATABLE deallocate unused keep 1400M.
Oracle crédite l'espace obtenu au quota utilisateur pour le tablespace concerné. L'espace inutilisé est désaloué en commençant avec la fin de l'objet vers le high-water mark. Si un extent est complètement contenu dans la desallocation, l'extent est complètement libéré. Si un extent est partiellement contenu dans la deallocation, la partie utilisée devient l'extent, et le reste est libéré. Le volume exact desaloué est dépendant des paramètres INITIAL, MINEXTENTS et NEXT. Si KEEP n'est pas spécifié et si le high-water mark est au-delà de INITIAL et MINEXTENTS, alors tout l'espace non utilisé au-delà du high-water mark est liberé. Quand le high-water mark est en deçà de la taille de INITIAL ou MINEXTENTS, alors tout l'espace non utilisé au-delà de MINEXTENTS est libéré. Si vous spécifiez l'option KEEP, le volume spécifié est maintenu. Quand le nombre restant d'extents est plus petit que MINEXTENTS, alors MINEXTENTS est ajusté au nouveau nombre d'extents. Si l'extent initial devient plus petit que INITIAL, alors INITIAL est réajusté. Dans tous les cas, NEXT est mis à la taille du dernier extent desaloué.

Petit exemple :

Création:
SQL> create table HWMT (c1 number, c2 number)
  2    storage (initial 16k next 16k minextents 3);
Table created.
Analyse
SQL> analyze table HWMT compute statistics;
Table analyzed.
SQL> SELECT blocks, empty_blocks, num_rows
  2    FROM dba_tables
  3    WHERE table_name = 'HWMT';
Nombre de blocs sous  Nombre de blocs au-dessus
   le high water mark         du high water mark   NUM_ROWS
--------------------- -------------------------- ----------
                    0                          6          0
HWM est à 0.
SQL> insert into hwmt values (1,2);
1 row created.
SQL> analyze table hwmt compute statistics;
Table analyzed.
SQL>   SELECT blocks, empty_blocks, num_rows
  2    FROM dba_tables
  3    WHERE table_name = 'HWMT';
Nombre de blocs sous  Nombre de blocs au-dessus
   le high water mark         du high water mark   NUM_ROWS
--------------------- -------------------------- ----------
                    1                          5          1
HWM est à 1 (1 bloc occupé)
SQL> delete from hwmt;
1 row deleted.
SQL> analyze table hwmt compute statistics;
Table analyzed.
SQL>   SELECT blocks, empty_blocks, num_rows
  2    FROM dba_tables
  3    WHERE table_name = 'HWMT';
Nombre de blocs sous  Nombre de blocs au-dessus
   le high water mark         du high water mark   NUM_ROWS
--------------------- -------------------------- ----------
                    1                          5          0
Bien que sans données, HWM reste à 1.
SQL> truncate table hwmt;
Table truncated.
SQL> analyze table hwmt compute statistics;
Table analyzed.
SQL>   SELECT blocks, empty_blocks, num_rows
  2    FROM dba_tables
  3    WHERE table_name = 'HWMT';
Nombre de blocs sous  Nombre de blocs au-dessus
   le high water mark         du high water mark   NUM_ROWS
--------------------- -------------------------- ----------
                    0                          6          0
Mac Gyver. HWM est redescendu à zero !

Copyright © 1998-2002 Radu Caulea, TAFORA MAJ 06/11/2006 !
Commentaires et suggestions radu[CHEZ]tafora.fr