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.