Avant une montée de version, une migration ou une revue du stockage, il faut une image rapide de l’occupation de la base. Ces requêtes lisent DBA_SEGMENTS et ALL_TABLES ; les résultats sont en gigaoctets sauf mention contraire.

1. Taille totale de la base

SELECT SUM(bytes/1024/1024/1024) FROM dba_segments;

2. Taille par tablespace

SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024/1024, 2) AS size_gb
FROM dba_segments
GROUP BY tablespace_name
ORDER BY size_gb DESC;

3. Taille par schéma (owner)

SELECT owner, SUM(bytes/1024/1024/1024) FROM dba_segments
GROUP BY owner
ORDER BY owner;

4. Espace fragmenté d’un schéma

Pour chaque table d’un schéma, on compare l’espace alloué (blocks) à l’espace réellement utile aux lignes (num_rows × avg_row_len). Un pourcentage élevé signale une table à réorganiser (par exemple avec ALTER TABLE … MOVE ou une redéfinition en ligne).

SELECT
  table_name,avg_row_len,round(((blocks*16/1024)),2)||'MB' "TOTAL_SIZE",
  round((num_rows*avg_row_len/1024/1024),2)||'Mb' "ACTUAL_SIZE",
  round(((blocks*16/1024)-(num_rows*avg_row_len/1024/1024)),2) ||'MB' "FRAGMENTED_SPACE",
  round((round(((blocks*16/1024)-(num_rows*avg_row_len/1024/1024)),2)/round(((blocks*16/1024)),2))*100,2) "percentage"
FROM
  all_tables
WHERE
  owner='<OWNER>'
  AND blocks>0;

Deux points d’attention :

  • 16 est la taille de bloc en Ko (DB_BLOCK_SIZE = 16384). Remplacez-la par celle de votre base.
  • Les chiffres viennent des statistiques de l’optimiseur (NUM_ROWS, AVG_ROW_LEN, BLOCKS) : collectez des statistiques à jour sur le schéma au préalable.