Tablespaces, Indexes, Clusters
Le niveau physique d'Oracle : comment les données dorment sur le disque, et comment on les réveille vite.
1. Sur chaque OS, Oracle redéfinit son système de fichiers
Le niveau physique du SPARC, c'est cette dégringolade en cascade : Base → Tablespace → Fichier → Segment → Extension → Bloc. C'est six étages de granularité, comme une coupe géologique.
La pile de stockage Oracle, depuis la base entière jusqu'au bloc physique sur disque.
Base · Tablespace · Fichier · Segment · Extension · Bloc
Du plus gros au plus petit. Le bloc logique Oracle ne correspond pas toujours à un bloc physique de l'OS — Oracle redéfinit son propre système de fichiers par-dessus celui de l'OS.
Ce chapitre traite du niveau physique. Il aborde trois grandes questions :
- Stockage — où vivent les données ? (segments, fichiers)
- Accélérateurs — comment chercher plus vite ? (indexes, clusters)
- Optimisation — comment Oracle choisit son plan de requêtes ?
2. Les cinq familles de segments
Un segment est le contenu d'un objet stocké : chaque table, chaque index, chaque cluster a son segment. Oracle en distingue cinq familles, chacune avec son rôle propre.
Tables utilisateurs et système + tables groupées (clusters). Un et un seul segment par table, créé auto à la création de la table.
Données des index. Peuvent être stockés dans un tablespace distinct de celui des données — précisable à la création.
Pour les requêtes nécessitant un espace disque temporaire (tri, hash). Créés au besoin, supprimés ensuite. Défini sur l'user, sinon SYSTEM.
Créé dans le tablespace SYSTEM. Contient les définitions du dictionnaire de données, chargées à l'ouverture de la base.
Contient les données avant modification. Permet d'annuler l'effet d'une transaction en cas de besoin.
-- Définir le tablespace temporaire d'un user
CREATE USER … TEMPORARY TABLESPACE …
3. Les trois fichiers d'Oracle
Tout le contenu de la base : tables, vues, procédures stockées…
Historique des modifications effectuées sur la BD. Indispensable à la reprise après panne.
État de la base : emplacement des fichiers, dates de création…
init.ora.
4. Accélérateurs : les indexes
Une sélection sur une grande table peut être longue. Indexer une table sur une colonne, c'est créer une seconde structure triée qui pointe vers les lignes de la table principale.
Recherche bien plus rapide quand la clause WHERE fait intervenir la colonne indexée.
À chaque MAJ de la table, l'index doit aussi être mis à jour. La mise à jour est donc plus longue.
La sélectivité — la métrique clé
- Sélectivité faible — peu de valeurs distinctes (ex. une colonne « sexe » avec H/F).
- Sélectivité forte — beaucoup de valeurs distinctes.
- Sélectivité = 1 — chaque valeur est unique (cas d'un index sur clé primaire).
Index B-TREE — l'arbre équilibré (défaut)
L'arbre balancé : tri hiérarchique des clés, accès en O(log n).
① Il est d'autant plus rentable que la sélectivité est élevée.
② Il ne gère pas les valeurs NULL. Donc il n'est pas utilisé pour rechercher des t-uples non renseignés sur les colonnes indexées.
Index BITMAP — la table de présences
L'idée du bitmap : une colonne binaire par valeur distincte. Comme un tableau de présences. Exemple du cours sur le Titanic, où la colonne Classe a 4 valeurs possibles :
L'index bitmap : une ligne par valeur distincte, un bit par tuple. Combinatoire ultra rapide en AND/OR.
① Faible sélectivité des colonnes indexées
② Beaucoup de lignes dans la table
③ Très peu d'activités de mise à jour
• MAJ d'une ligne ⇒ reconstruction totale de l'index bitmap (coûteux !)
•
NULL est une valeur comme une autre ⇒ l'index gère les NULL.
Syntaxes Oracle de création
-- Index B-TREE (par défaut)
CREATE [UNIQUE] INDEX nomIndex
ON Nom_de_la_table (NomChamp [ASC/DESC], …)
TABLESPACE nomTablespace;
-- UNIQUE impose des valeurs distinctes d'une ligne à l'autre
-- Index B-TREE INVERSÉ : la valeur 'abc' est indexée avec 'cba'
CREATE [UNIQUE] INDEX nomIndex
ON Nom_de_la_table (NomChamp …) REVERSE;
-- Annuler l'inversion
ALTER INDEX nomIndex REBUILD NOREVERSE;
-- Index par fonction
CREATE INDEX nomIndex
ON Nom_de_la_table (f(NomChamp) [ASC/DESC], …);
CREATE FUNCTION … RETURN xxx DETERMINISTIC. Et SYSDATE n'est pas déterministe.
-- Index BITMAP (uniquement en version Entreprise)
CREATE BITMAP INDEX nomIndex
ON Nom_de_la_table (NomChamp …);
5. Accélérateurs : les clusters
Dans un MCD, les associations (1,1) (1,n) sont très fréquentes. En BD, elles sont traitées par une clé étrangère côté (1,1) qui est la clé primaire côté (1,n).
• Une facture est associée à un client
• Une ligne de commande est associée à une commande
Vocabulaire : on parle de relations Maître – Détails.
Le problème — et la solution
Cluster = stockage colocalisé des lignes Maître+Détails partageant la même clé.
Trois propriétés à retenir
- Un cluster permet de stocker des tables ayant des colonnes en commun. Il remplace le tablespace.
- Les lignes de tables différentes ayant les mêmes valeurs sur les colonnes communes sont proches sur le disque dur.
- Les colonnes communes ne sont pas physiquement dupliquées. Un index de cluster sur ces colonnes est créé.
Syntaxe
CREATE CLUSTER Nom(col1 type1 [col2 type2 …])
SIZE tailleBloc TABLESPACE nomTablespace;
CREATE TABLE nomTable(…) CLUSTER nomCluster(colT1, [colT2 …]);
-- où colTi sont des colonnes de la table
-- Crucial : créer l'index de cluster, sinon rien ne marche !
CREATE INDEX nomIndex ON CLUSTER nomCluster;
Mise en cluster d'une table existante
- Créer une nouvelle table avec l'option
CLUSTER - Copier le contenu de la table initiale
- Supprimer l'ancienne table
- Éventuellement renommer la nouvelle
★ Réviser le chapitre
Pour vérifier ta compréhension
Quelle est la différence concrète entre un tablespace et un segment ?
Le tablespace est un conteneur logique qui regroupe un ou plusieurs fichiers. Le segment est l'occupation effective d'un objet (table, index, cluster) à l'intérieur d'un tablespace. Un tablespace contient plusieurs segments ; un segment vit dans un seul tablespace.
Pourquoi un B-tree perd-il son intérêt sur une colonne du genre « sexe » (H/F) ?
La sélectivité est extrêmement faible (2 valeurs pour potentiellement des millions de lignes). Le B-tree va devoir descendre l'arbre puis remonter plein de rowids pointant vers ~50% de la table — pas plus rapide qu'un full scan. C'est typiquement le cas où on utilise un index bitmap.
Pourquoi déconseille-t-on un bitmap sur une table très souvent mise à jour ?
Parce qu'une modification d'une ligne entraîne la reconstruction totale de l'index bitmap. Sur une table OLTP avec milliers d'inserts/updates par minute, c'est un suicide en performance.
Quand peut-on décider de mettre en place un cluster ?
Quand on a une relation Maître–Détails (associations (1,1)–(1,n)) sur laquelle on fait souvent des jointures naturelles, et que ces jointures coûtent cher. Le cluster colocalise les lignes par clé commune, transformant une jointure aléatoire en lecture séquentielle.
Pourquoi SYSDATE ne peut pas servir dans un index par fonction ?
Parce que SYSDATE n'est pas déterministe : son résultat varie d'un instant à l'autre. Un index par fonction exige que la fonction produise toujours la même sortie pour la même entrée — sinon l'index pointe vers du vide.
🃏 Flashcards éclair
Clique pour retourner.
Hiérarchie stockage
Du plus gros au plus petit ?
tourne →(mnémo : BTF · SEB)
5 segments
Cite-les.
tourne →3 fichiers Oracle
Avec extensions.
tourne →.dbf · Redo Log .rdo/.log · Contrôle .ctlMin : 1+2+1
Sélectivité
Formule.
tourne →1 = clé primaire (max)
B-tree
2 limites majeures.
tourne →② Ne gère pas les
NULL
Bitmap
3 conditions d'usage.
tourne →② Beaucoup de lignes
③ Très peu de MAJ
Bitmap vs NULL
Le bitmap gère-t-il NULL ?
tourne →(Contrairement au B-tree)
Index B-tree inversé
Que fait-il ?
tourne →'abc' est indexée comme 'cba'. Utile pour répartir les insertions séquentielles.
Index par fonction
Contrainte sur la fonction ?
tourne →SYSDATE n'est pas déterministe.
Cluster
Ce qu'il remplace, ce qu'il faut en plus.
tourne →Requiert un index de cluster sur les colonnes communes.
Mise en cluster
Les 4 étapes.
tourne →② Copier le contenu
③ Drop l'ancienne
④ Renommer
Créer un index
Syntaxe générique.
tourne →CREATE [UNIQUE] INDEX nom
ON tbl(col [ASC/DESC])
TABLESPACE ts;
✎ Quiz éclair
statut avec 4 valeurs distinctes pour 2 millions de lignes, peu d'inserts. Quel index ?DETERMINISTIC retourne toujours la même valeur pour la même entrée. SYSDATE par exemple ne l'est pas.CREATE INDEX ON CLUSTER …, aucune opération n'est possible sur les tables clustérisées.📌 Pour la feuille recto-verso
- Hiérarchie : Base → Tablespace → Fichier → Segment → Extension → Bloc (BTF·SEB)
- 5 segments : Données · Index · Temporaire · Amorçage · Rollback
- 3 fichiers :
.dbf·.rdo/.log·.ctl— min 1+2+1 - Sélectivité = nb valeurs distinctes / nb lignes
- B-tree : forte sélectivité, ne gère pas NULL
- Bitmap : faible sélectivité, beaucoup de lignes, peu de MAJ, gère NULL
- MAJ d'une ligne ⇒ reconstruction totale d'un bitmap
- Index par fonction : fonction
DETERMINISTICobligatoire (SYSDATENON) CREATE [UNIQUE] INDEX nom ON tbl(col) [REVERSE]CREATE BITMAP INDEX— Enterprise Edition uniquement- Cluster = optimisation jointure Maître/Détails, remplace le tablespace
- Cluster requiert un
CREATE INDEX ON CLUSTER nomCluster - Mise en cluster d'une table existante : 4 étapes (nouv. table CLUSTER → copy → drop → rename)