it-swarm.com.de

Tabellen- und Indexfragmentierung

Gibt es eine Möglichkeit zu überprüfen, ob eine Tabelle oder ein Index fragmentiert wurde?

Wie überprüfe ich, ob die Tabelle fragmentiert ist oder nicht?

Wie überprüfe ich, ob der Index fragmentiert ist?

Ich habe bei Google gesucht, aber keine zufriedenstellenden Antworten erhalten. Einige Punkte wie Plan erklären, Tabellenfragmentierung, Indexwiederherstellung usw. habe ich bekommen. Aber was sollte unser erster Schritt sein und wie sollte gelöst werden. Wie können wir Schritt für Schritt vorankommen, um das Problem zu lösen?

3
Onkar Tiwari

Sie müssen die Ansicht INDEX_STATS Verwenden, um die Fragmentierung zu bestimmen.

Zunächst müssen Sie diese Ansicht mit einem individuellen Index füllen, indem Sie Folgendes verwenden:

SQL> analyze index <your_index> validate structure;

und dann schauen Sie sich diese Werte ratio und height an:

select round((del_lf_rows/lf_rows)*100,2) ratio, height, lf_blks, lf_rows 
  from index_stats;

Wenn Verhältnis mehr als% 20 ist

oder Höhe ist größer oder gleich 4

oder lf_rows ist niedriger als lf_blks ,

dann müssen Sie Ihren Index gegen Fragmentierung neu erstellen.


Die Spalte blevel der Tabelle dba_indexes Ist mein Hauptinteresse. Dies gibt die Anzahl der Verzweigungsebenen (einschließlich des Wurzelknotens) für einen B-Baum-Index an, und die Spalte height ist eng verwandt mit blevel.

Wenn Sie Zugriff auf MOSC haben, suchen Sie nach dem Schlüsselwort blevel, insbesondere nach dem Betreff Index Health. Die Oracle-Community schlug außerdem vor, die Neuerstellung von Indizes für Indizes größer oder gleich 4 zu sein.

5
Barbaros Özhan

die Abfrage ist nicht korrekt, da Sie kbytes mit mbytes vergleichen. Das ist das Richtige:

wählen Sie Eigentümer, Tabellenname, Runde ((Blöcke * 8), 2)/1024 "Größe (mb)", Runde (((num_rows * avg_row_len)/1024/1024), 2) "Ist-Daten (mb)", (Runde ( (Blöcke * 8), 2)/1024 - Runde (((num_rows * avg_row_len)/1024/1024), 2)) "Wasted_space (mb)" aus dba_tables wobei (Runde ((Blöcke * 8), 2)/1024 > runde (((num_rows * avg_row_len)/1024/1024), 2)) Reihenfolge um 4;

0
Massimo Tartara

Sie können eine fragmentierte Tabelle mit der folgenden Abfrage finden

SQL> select  table_name,round((blocks*8),2)/1024 "size (mb)" ,
round((num_rows*avg_row_len/1024/1024),2) "actual_data (mb)",
(round((blocks*8),2) - round((num_rows*avg_row_len/1024/1024),2)) "wasted_space (mb)"
from  dba_tables
where (round((blocks*8),2) > round((num_rows*avg_row_len/1024/1024),2))
order by 4 desc;

nd unten verwenden, um einen fragmentierten Index zu finden. 1. Unten ausführen

SQL> ANALYZE INDEX index_name VALIDATE STRUCTURE;

Sobald dies oben erledigt ist, können Sie den Indexanalysebericht im Bericht aus der Tabelle INDEX_STATS mithilfe der folgenden Abfrage abrufen.

  SQL> SELECT name,height,lf_rows,lf_blks,lf_rows_len,lf_blk_len,del_lf_rows,distinct_keys,used_space/1024/1024 used_space

FROM INDEX_STATS;

Diese INDEX_STATS-Tabelle enthält nur 1 Zeile. Um einen Bericht mit mehreren Indizes zu erhalten, müssen Sie einen nach dem anderen ausführen und nach jedem Lauf einen Bericht abrufen.

0