web-dev-qa-db-fra.com

Récupérer l'espace logique à partir d'un espace de table

J'ai un espace de table appelé Data, et c'est configuré avec Auto-EXTEND. Cet espace de table comporte deux datafiles et est mis en place afin qu'il prend 350 Go d'espace physique.

Il y a une semaine, j'ai interrogé user_tablespaces et dba_data_files et remarqua qu'il avait 20% de l'espace logique disponible. J'ai ensuite procédé à un nettoyage et supprimé de nombreux documents des tables de cette épis de table. Nous nous attendions à voir une forte augmentation de l'espace disponible. Malheureusement, lorsque j'ai interrogé les vues que j'ai remarquées, l'espace disponible était maintenant de 20,5%.

Cela pourrait-il être dû à la fragmentation des données? Peut-on "défrasser" l'espace de table et récupérer l'espace perdu? Ou avez-nous besoin de recréer l'espace de table de zéro?

11
Nuno Furtado

Lorsque vous supprimez des enregistrements, rien ne compacte automatiquement le segment, vous devrez donc vous rétrécir pour récupérer l'espace. Voici l'extrait du Guide de l'administrateur 11.2 sur Récupération de l'espace gaspillé :

Au fil du temps, les mises à jour et les suppressions sur les objets dans un espace de table peuvent créer des poches d'espace vide qui ne sont pas suffisamment grandes pour être réutilisées pour de nouvelles données. Ce type d'espace vide est appelé espace libre fragmenté.

Les objets avec un espace libre fragmenté peuvent entraîner une grande espace gaspillée et peuvent avoir une incidence sur la performance de la base de données. Le moyen préféré de défragmenter et de récupérer cet espace est d'effectuer un segment en ligne. Ce processus consolide l'espace libre fragmenté sous la marque d'eau élevée et compacte le segment. Après le compactage, la hauteur de l'eau est déplacée, ce qui entraîne un nouvel espace libre au-dessus de la hauteur élevée de l'eau. Cet espace au-dessus de la hauteur de la marque d'eau est ensuite traitée. Le segment reste disponible pour les requêtes et les DML pendant la majeure partie de l'opération et aucun espace disque supplémentaire n'a besoin d'être attribué.

Plus bas sur la même page, vous pouvez lire ceci:

Segment Strink est une opération en ligne et en place. Les opérations et les requêtes DML peuvent être émises lors de la phase de mouvement de données du segment diminuent. Les opérations DML simultanées sont bloquées pendant une courte période à la fin de l'opération de rétrécissement, lorsque l'espace est distribué. Les index sont maintenus pendant l'opération de rétrécissement et restent utilisables après la fin de l'opération. Le segment diminuant ne nécessite pas d'espace de disque supplémentaire à affecter.

Le segment diminue recouvre l'espace non utilisé au-dessus et au-dessous de la hauteur de hauteur. En revanche, la répartition de l'espace recouvre l'espace inutilisé uniquement au-dessus de la hauteur de l'eau. Dans les opérations rétrécissantes, par défaut, la base de données compacte le segment, ajuste la hauteur de l'eau et libère l'espace récupéré.

La page inclut beaucoup plus d'informations sur la question, y compris des exemples.

Le "espace de segment et marque de hautes eaux" section du Guide Concepts pourrait également être utile.

14
Leigh Riffel

Oui, ce sera dû à la fragmentation.

Pour récupérer l'espace, obtenez d'abord une liste de tables dans l'espace de table avec la requête suivante (ignorant les partitions - Modifiez votre question si vous les utilisez):

select distinct table_name from dba_tables where tablespace_name = 'DATA';

Ensuite, pour chaque table, activez le mouvement de la ligne:

alter table TABLEINDATAPARTITION enable row movement;

Vous pouvez ensuite rétrécir la table:

alter table TABLEINDATAPARTITION shrink space;

Puis rétrécissez les fichiers de données avec:

alter database datafile '/path/to/my/file/data01.dbf' resize 20480M;

Les noms de Datafile peuvent être obtenus à partir de la vue DBA_DATA_FILES, Que vous êtes déjà au courant.

9
Philᵀᴹ