Oracle-Datenbank automatisch optimieren
Das High-Watermark bei Full Table Scans
Ein Segment benutzt Datenblöcke, um Extents zu erzeugen. Oracle speichert die größte Blocknummer, die jemals von dem Segment benutzt wurde. Die Block-ID wird High Watermark genannt.
Das High Watermark wird nicht verändert, wenn Sätze gelöscht werden und damit leere Blöcke entstehen. Wenn ein Full Table Scan durchgeführt wird, dann liest Oracle alle Blöcke bis zum High Watermark, auch die leeren.
Das folgende Beispiel zeigt, wie ein High Watermark die Performance beeinflussen kann. Obwohl sich nur ein Datensatz in der Tabelle befindet, braucht die Abfrage sehr lange.
SQL> SELECT count(*) FROM household_facts3;
COUNT(*)
----------
1
Abgelaufen: 00:00:23.01
Oracle liest in diesem Beispiel eine große Anzahl leerer Blöcke. Wenn Sie sich in folgendem Listing die Blockzahlen anschauen, ist die Laufzeit nicht mehr verwunderlich.
SQL> SELECT table_name, empty_blocks, blocks
2 FROM dba_tables
3 WHERE table_name = 'HOUSEHOLD_FACTS';
TABLE_NAME EMPTY_BLOCKS BLOCKS
------------------------------ ------------ ----------
HOUSEHOLD_FACTS3 0 42736
Die Spalte EMPTY_BLOCKS
enthält die Anzahl von Blöcken über dem High-Watermark, wogegen BLOCKS
die Blöcke unter High-Watermark zählt. Da die Tabelle fast leer ist, existieren viele leere Blöcke.
Verwenden Sie für lokal verwaltete Tabellen mit automatischer Segmentverwaltung das Paket DBMS_SPACE
für Informationen über unbenutzten Platz und zum Herabsetzen des High-Watermarks.