A.4 - Segments, extents et blocs

Segments

Un segment est composé d’extents. Un extent est composé de blocs contigus dont la taille dépend de l’OS. Le segment s’étend dynamiquement au sein du tablespace (éventuellement sur plusieurs fichiers donc…).

segment1

Il existe plusieurs types de segments :
- segment de données = table
- segment d’index = index
- segment d’annulation = rollback segment, qui stocke l’image avant modification des données
- segment temporaire , utilisé en interne par Oracle, si la zone mémoire de tri est insuffisante

remarque : seuls les objets ‘physiques’ peuvent être des segments. Ainsi une vue ou un synonyme n’est pas un segment…

On peut forcer les segments de données et d’index à s’implanter dans un tablespace particulier :
- explicitement à la création du segment
- implicitement en affectant un tablespace par défaut à l’utilisateur qui va créer le segment.

SQL> create table credit (n number, …)
tablespace TBS_COMPTA;
ou bien
SQL> create user Appli_comptable default tablespace COMPTA;
SQL> create table credit (n number, …);

Description dans la vue dba_segments du dictionnaire.

principe d’allocation des tables spaces

Allocation des Tablespaces standards

L’allocation obéit à des règles définies par une clause STORAGE. Oracle applique d’abord la clause STORAGE du segment (définie explicitement dans un create table par exemple), sinon il utilise la clause du tablespace (définie explicitement lors du create tablespace), sinon il utilise les valeurs par défaut (implicites) du tablespace.

Au départ, lors de la création du segment (table, index ou autre) Oracle alloue MINEXTENTS extents de taille INITIAL. Ensuite, lorsque le segment se remplit, quand le(s) premier(s) extent(s) est (sont) plein(s), il alloue un extent de taille NEXT. Ensuite il augmente la taille des extents d’un pourcentage fixé par PCTINCREASE. La limite est définie par MAXEXTENTS.

SQL> create table credit (n number,…)
storage ( initial 10K next 10K pctincrease 50 maxextents 100) ;

voici ce que donne le segment après création, puis 2 allocations supplémentaires :

Voir dba_extents dans le dictionnaire.

allocation

Allocation des Tablespaces gérés localement

Il y a deux types d’allocation pour ces tablespaces :

* “SYSTEM” : le DBA précise la taille de l’extent INITIAL puis Oracle détermine au mieux la taille des extents suivants (minimum 64K)
* “UNIFORM” : tous les extents auront la même taille, précisée par le DBA, ou la taille par défaut : 1MO

La gestion de l’espace libre

Lorsqu’un tablespace est créé (et le fichier minimum associé) Il est pratiquement vide hormis l’entête du fichier. L’espace libre (FREE SPACE) diminue au fur et à mesure de la creation ou de l’augmentation des segments dans ce tablespace et se fragmente lors de la libération de blocs (DELETE, TRUNCATE, etc).
Une “carte des trous” est donnée dans DBA_FREE_SPACE. Cette table possède une ligne par trou et la colonne BYTES donne la taille de chaque trou en octets.
Pour avoir l’espace libre total d’un tablespace il faudra donc sommer tous les espaces libres de tous les fichiers du tablespace.

SELECT SUM(BYTES)/1024 “Taille en KO” FROM DBA_FREE_SPACE
WHERE TABLESPACE_NAME= ‘TBS_TOTO

Pour récupérer l’espace libre d’un segment, on peut utiliser
TRUNCATE table_toto DROP STORAGE
ou
ALTER TABLE table_toto DEALLOCATE UNUSED

L’espace libre est défragmenté de temps en temps par Oracle. En clair les espaces libres contigus sont fusionnés (COALESCED).

voir DBA_FREE_SPACE_COALESCED dans le dictionnaire.

On peut faire un COALESCE manuel :
ALTER TABLESPACE toto COALESCE