Oracle, en tant que très grande base de données, est largement utilisé dans les grandes organisations disposant d'un débit de données énorme et de réseaux informatiques étendus, telles que la finance, les postes et télécommunications, l'énergie électrique et l'aviation civile. Quant aux administrateurs système, il est particulièrement important d’assurer le fonctionnement stable du réseau et d’améliorer les performances de la base de données pour la rendre plus sécurisée et efficace. En tant que facteur majeur affectant les performances de la base de données, la fragmentation de la base de données devrait susciter suffisamment d'attention de la part du DBA. La découverte et le nettoyage en temps opportun des fragments constituent un contenu de maintenance de base du DBA.
1. Pourquoi des fragments apparaissent-ils ?
Lorsqu'une base de données est générée, elle sera divisée en plusieurs segments logiques (Segments) appelés espaces de table (Tablespace), tels que l'espace de table système (Système), l'espace de table temporaire (Temporaire), etc. Un espace table peut contenir plusieurs plages de données (Etendue) et un ou plusieurs blocs libres, c'est-à-dire de l'espace libre (Free Space).
Les relations logiques entre les espaces table, les segments, les catégories et les espaces libres sont les suivantes :
Lorsqu'un segment est créé dans un espace table, l'espace sera alloué pour la portée initiale du segment à partir de l'espace libre effectif de l'espace table. Lorsque ces plages initiales sont remplies de données, le segment demandera l’ajout d’une autre plage. Ce processus d'expansion se poursuivra jusqu'à ce que la valeur maximale de la plage soit atteinte et il se peut qu'il n'y ait plus d'espace libre dans l'espace table pour la plage suivante. La situation la plus idéale est que les données d’un segment puissent être stockées dans une seule catégorie. De cette manière, toutes les données sont stockées à proximité des autres données du segment et moins de pointeurs sont nécessaires pour rechercher les données. Cependant, il existe de nombreux cas où un segment contient plusieurs champs, et il n'existe aucun moyen de prouver que ces champs sont stockés à proximité. Lorsqu'un besoin d'espace doit être satisfait, la base de données ne ferme plus la plage libre adjacente (sauf s'il n'y a aucun moyen), mais recherche la plage libre la plus grande à utiliser dans l'espace table. Cela formera progressivement des espaces libres de plus en plus discrets, séparés et plus petits, c'est-à-dire des fragments.
2. Impact de la fragmentation sur le système
Au fil du temps, l'utilisation généralisée de systèmes d'application basés sur des bases de données générera de plus en plus de fragments, ce qui aura les deux impacts importants suivants sur la base de données :
1) Encourir une réduction des performances du système
En général, lorsqu'un besoin d'espace doit être satisfait, la base de données recherchera d'abord le plus grand espace libre actuellement, et le « plus grand » espace libre deviendra progressivement plus petit, et il deviendra de plus en plus difficile de trouver un espace libre suffisamment grand. est difficile, donc les obstacles de vitesse dans l'espace table éloignent de plus en plus l'allocation d'espace de la base de données de l'état idéal ;
2) Répartir une grande quantité d’espace de table
Bien que certaines zones libres (telles que l'augmentation de pc de l'espace table est non nulle) soient fusionnées périodiquement par le processus de boss en arrière-plan SMON (surveillance du système), il existe toujours des zones libres qui ne peuvent pas être automatiquement fermées, ce qui gaspille beaucoup de table. espace. .
3. Calcul de fragments de catégories gratuites
Étant donné que la fragmentation de l'espace libre est composée de plusieurs parties, telles que le nombre de catégories, la taille maximale de la plage, etc., nous pouvons utiliser la valeur FSFI - Free Space Fragmentation Index (Free Space Fragmentation Index) pour refléter intuitivement :
FSFI=100*SQRT(max(étendue)/somme(étendues))*un/SQRT(SQRT(compte(étendues)))
Comme on peut le voir, la valeur maximale de FSFI est de 100 (un espace table unique idéal). À mesure que la portée augmente, la valeur FSFI diminue lentement et à mesure que la taille maximale de la portée diminue, la valeur FSFI diminue rapidement.
Le script suivant peut être utilisé pour calculer la valeur FSFI :
calcul de la valeur rem FSFI
rem fsfi.sql
colonne format FSFI 999,99
sélectionnez nom_espace_table, sqrt(max(blocs)/somme(blocs))*
(100/carré(carré(compte(blocs)))) FSFI
de dba_free_space
regrouper par tablespace_name, commander par un ;
bobine fsfi.rep ;
/
bobine;
Par exemple, lors de l'exécution du script fsfi.sql dans une certaine base de données, les valeurs FSFI suivantes sont perdues :
TABLESPACE_NAMEFSFI
------------------------------- -------
RBS 74.06
SYSTÈME 100,00
TEMP 22,82
OUTILS 75,79
UTILISATEURS 100,00
USER_TOOLS 100,00
YDCX_DONNÉES 47.34
YDCX_IDX 57.19
YDJF_DONNÉES 33,80
YDJF_IDX 75,55
---- Une fois la valeur FSFI de la base de données calculée, elle peut être utilisée comme paramètre comparable. Dans un espace table avec suffisamment d'espace libre effectif et une valeur FSFI supérieure à 30, des problèmes d'espace libre effectif sont rarement rencontrés. Lorsqu’un espace est proche de paramètres comparables, il faut le défragmenter.
4. Trier les fragments de catégories gratuites
La valeur pctincrease de l'espace table est différente de zéro.
Vous pouvez modifier le paramètre de stockage par défaut pctincrease de l'espace table sur une valeur différente de zéro. Normalement, définissez-le sur un, comme :
modifier la température du tablespace
stockage par défaut (pctincrease 1);
De cette façon, SMON regroupera automatiquement les catégories gratuites. Vous pouvez également regrouper manuellement les catégories gratuites :
modifier la fusion de la température du tablespace ;
5. Reprendre les fragments du paragraphe
Nous savons que les segments sont composés de catégories. Dans certains cas, il est nécessaire de nettoyer les fragments du segment. Pour afficher les informations relatives aux segments, consultez le dictionnaire de données dba_segments et pour les informations sur les catégories, consultez le dictionnaire de données dba_extents.
Segment de données de requête
sélectionnez le nom du segment, le nom de l'espace table, les octets et les blocs dans USER_EXTENTS ;
Segment de répertoire de requête
sélectionnez index_name, table_owner, table_name, tablespace_name dans USER_EXTENTS ;
Afficher les informations sur les segments via dba_segments
select tablespacee_name,count(*) nobjects,round(sum(bytes)/1024/1204/1024.2) GB,sum(blocks),sum(extents) from
groupe dba_segments par rollup (tablespace_name);
Si un segment est excessivement fragmenté, le moyen le plus simple de compresser ses données dans une plage est de reconstruire le segment avec les paramètres de stockage corrects, puis d'insérer les données de l'ancienne table dans la nouvelle table et en même temps de supprimer l'ancienne table. . Ce processus peut être accompli à l’aide de l’outil Import/Export (entrée/sortie).
La commande Export () a un indicateur (compressé) qui, lors de la lecture de la table, amènera Export à déterminer la quantité d'espace physique alloué à la table et à écrire un nouveau paramètre de stockage d'initialisation dans les données de vidage de sortie, c'est-à-dire Allouer de l'espace. Si cette table est fermée, utilisez l'outil Import() pour la régénérer. De cette façon, ses données seront placées dans un nouveau segment initial plus grand. Par exemple:
exp utilisateur/mot de passe fichier=exp.dmp compress=Y subventions=Y index=Y
tables=(tableau un, tableau deux);
Si la sortie se déroule correctement, supprimez la table exportée de la bibliothèque, puis importez-la à partir des données de vidage de sortie :
imp user/mot de passe file=exp.dmp commit=Y buffer=64000 full=Y