Als sehr große Datenbank wird Oracle häufig in großen Organisationen mit großem Datendurchsatz und ausgedehnten Computernetzwerken wie Finanzen, Post und Telekommunikation, Elektrizität und Zivilluftfahrt eingesetzt. Für Systemadministratoren ist es besonders wichtig, den stabilen Betrieb des Netzwerks sicherzustellen und die Datenbankleistung zu verbessern, um es sicherer und effizienter zu machen. Als wichtiger Faktor, der die Datenbankleistung beeinflusst, sollte die Datenbankfragmentierung die ausreichende Aufmerksamkeit des DBA erregen. Die rechtzeitige Erkennung und Bereinigung von Fragmenten ist ein grundlegender Wartungsinhalt des DBA.
1. Warum entstehen Fragmente?
Wenn eine Datenbank generiert wird, wird sie in mehrere logische Segmente (Segmente) unterteilt, die als Tablespaces (Tablespace) bezeichnet werden, z. B. System-Tablespace (System), temporärer (Temporärer) Tablespace usw. Ein Tabellenbereich kann mehrere Datenbereiche (Extent) und einen oder mehrere freie Bereichsblöcke, also freien Speicherplatz (Free Space), enthalten.
Die logischen Beziehungen zwischen Tabellenbereichen, Segmenten, Kategorien und Freiräumen sind wie folgt:
Wenn ein Segment in einem Tabellenbereich erstellt wird, wird für den anfänglichen Bereich des Segments Speicherplatz aus dem effektiven freien Speicherplatz des Tabellenbereichs zugewiesen. Wenn diese anfänglichen Bereiche mit Daten gefüllt sind, fordert das Segment das Hinzufügen eines weiteren Bereichs an. Dieser Erweiterungsprozess wird fortgesetzt, bis der maximale Bereichswert erreicht ist und möglicherweise kein freier Speicherplatz im Tabellenbereich für den nächsten Bereich vorhanden ist. Im Idealfall können die Daten eines Segments in einer einzigen Kategorie gespeichert werden. Auf diese Weise werden alle Daten in der Nähe anderer Daten im Segment gespeichert und es werden weniger Zeiger benötigt, um Daten zu finden. Es gibt jedoch viele Fälle, in denen ein Segment mehrere Felder enthält und es keine Möglichkeit gibt, nachzuweisen, dass diese Felder in der Nähe gespeichert sind. Wenn ein Platzbedarf gedeckt werden muss, schließt die Datenbank nicht mehr den angrenzenden freien Bereich (es sei denn, es gibt keine Möglichkeit), sondern sucht nach dem größten freien Bereich im zu verwendenden Tabellenbereich. Dadurch entstehen nach und nach immer mehr diskrete, getrennte, kleinere Freiräume, also Fragmente.
2. Auswirkungen der Fragmentierung auf das System
Mit der Zeit wird die weit verbreitete Nutzung datenbankbasierter Anwendungssysteme immer mehr Fragmente erzeugen, was die folgenden zwei wichtigen Auswirkungen auf die Datenbank haben wird:
1) Es kommt zu einer Verringerung der Systemleistung
Wenn ein Platzbedarf gedeckt werden soll, sucht die Datenbank im Allgemeinen zunächst nach dem derzeit größten Freiland, und das „größte“ Freiland wird nach und nach kleiner, und es wird immer schwieriger, ein ausreichend großes Freiland zu finden ist schwierig, sodass die Speicherzuteilung der Datenbank aufgrund der Geschwindigkeitshindernisse im Tabellenbereich immer weiter vom Idealzustand entfernt ist.
2) Verteilen Sie viel Platz auf dem Tisch
Obwohl einige freie Bereiche (z. B. die Erhöhung des Tabellenbereichs ungleich Null) regelmäßig durch den Hintergrund-Boss-Prozess SMON (Systemüberwachung) zusammengeführt werden, gibt es immer einige freie Bereiche, die nicht automatisch geschlossen werden können, wodurch viel Tisch verschwendet wird Raum. .
3. Fragmentberechnung freier Kategorien
Da die Fragmentierung des freien Speicherplatzes aus mehreren Teilen besteht, z. B. der Anzahl der Kategorien, der maximalen Bereichsgröße usw., können wir den Wert FSFI – Free Space Fragmentation Index (Free Space Fragmentation Index) verwenden, um Folgendes intuitiv zu reflektieren:
FSFI=100*SQRT(max(extent)/sum(extents))*one/SQRT(SQRT(count(extents)))
Wie ersichtlich ist, beträgt der Maximalwert von FSFI 100 (ein idealer Einzeltabellenbereich). Wenn der Bereich zunimmt, nimmt der FSFI-Wert langsam ab, und wenn die maximale Bereichsgröße abnimmt, nimmt der FSFI-Wert schnell ab.
Zur Berechnung des FSFI-Wertes kann das folgende Skript verwendet werden:
rem FSFI Value Compute
rem fsfi.sql
Spalte FSFI-Format 999,99
select tablespace_name,sqrt(max(blocks)/sum(blocks))*
(100/sqrt(sqrt(count(blocks)))) FSFI
von dba_free_space
nach Tabellenbereichsname gruppieren, Reihenfolge nach Eins;
spool fsfi.rep;
/
abspulen;
Wenn beispielsweise das Skript fsfi.sql in einer bestimmten Datenbank ausgeführt wird, gehen die folgenden FSFI-Werte verloren:
TABLESPACE_NAME FSFI
---------------- -------
RBS 74.06
SYSTEM 100,00
TEMPERATUR 22,82
WERKZEUGE 75,79
BENUTZER 100,00
USER_TOOLS 100,00
YDCX_DATA 47,34
YDCX_IDX 57.19
YDJF_DATA 33,80
YDJF_IDX 75,55
---- Sobald der FSFI-Wert der Datenbank berechnet ist, kann er als Vergleichsparameter verwendet werden. In einem Tabellenbereich mit ausreichend effektivem freien Speicherplatz und einem FSFI-Wert über 30 treten Probleme mit effektivem freien Speicherplatz selten auf. Wenn ein Speicherplatz nahe an vergleichbaren Parametern liegt, muss er defragmentiert werden.
4. Aussortieren der Fragmente freier Kategorien
Der pctincrease-Wert des Tabellenbereichs ist ungleich Null
Sie können den Standardspeicherparameter pctincrease des Tabellenbereichs auf einen Wert ungleich Null ändern. Stellen Sie es normalerweise auf eins ein, etwa:
Tablespace-Temp ändern
Standardspeicher (pctincrease 1);
Auf diese Weise gruppiert SMON automatisch die freien Kategorien. Sie können kostenlose Kategorien auch manuell gruppieren:
Ändern Sie den temporären Zusammenschluss des Tabellenbereichs.
5. Aufnehmen der Fragmente des Absatzes
Wir wissen, dass Segmente aus Kategorien bestehen. In manchen Fällen ist es notwendig, die Fragmente des Segments zu bereinigen. Um segmentbezogene Informationen anzuzeigen, sehen Sie sich das Datenwörterbuch dba_segments an, und für Kategorieinformationen sehen Sie sich das Datenwörterbuch dba_extents an.
Datensegment abfragen
Wählen Sie segment_name,tablespace_name,bytes,blocks aus USER_EXTENTS;
Verzeichnissegment abfragen
Wählen Sie index_name,table_owner,table_name,tablespace_name aus USER_EXTENTS;
Zeigen Sie Segmentinformationen über dba_segments an
Wählen Sie tablespacee_name,count(*) nobjects,round(sum(bytes)/1024/1204/1024.2) GB,sum(blocks),sum(extents) aus
dba_segments-Gruppe nach rollup(tablespace_name);
Wenn ein Segment übermäßig fragmentiert ist, können Sie seine Daten am einfachsten in einen Bereich komprimieren, indem Sie das Segment mit den richtigen Speicherparametern neu erstellen, dann die Daten aus der alten Tabelle in die neue Tabelle einfügen und gleichzeitig die alte Tabelle löschen . Dieser Vorgang kann mit dem Import/Export-Tool (Eingabe/Ausgabe) durchgeführt werden.
Der Export()-Befehl verfügt über ein (komprimiertes) Flag, das beim Lesen der Tabelle dazu führt, dass Export die Menge des der Tabelle zugewiesenen physischen Speicherplatzes ermittelt und einen neuen Initialisierungsspeicherparameter in die Ausgabe-Dump-Daten schreibt, d. h. alle Platz zuweisen. Wenn diese Tabelle geschlossen ist, verwenden Sie das Tool Import(), um sie neu zu generieren. Auf diese Weise werden seine Daten in einem neuen, größeren Anfangssegment platziert. Zum Beispiel:
exp user/password file=exp.dmp compress=Y grants=Y indexes=Y
tables=(table one, table two);
Wenn die Ausgabe reibungslos verläuft, löschen Sie die exportierte Tabelle aus der Bibliothek und importieren Sie die Tabelle dann aus den Ausgabe-Dump-Daten:
imp user/password file=exp.dmp commit=Y buffer=64000 full=Y